SQL sever中的函数(基础)

目录

一、聚合函数

1.1聚合函数概述

1.2SUM(求和)函数

1.3AVG(平均值)函数

1.4MIN(最小值)函数

1.5MAX(最大值)函数

1.6COUNT(统计)函数

1.6.1COUNT函数用法分类

1.6.2COUNT函数用法示例

1.7DISTINCT(取不重复记录)函数

1.8查询重复记录

二、数学函数

2.1数学函数概述

2.2ABS(绝对值)函数

2.3PI(圆周率)函数

2.4POWER(乘方)函数

2.5RAND(随机浮点数)函数

2.6ROUND(四舍五入)函数

2.7SQUARE(平方)函数和SQRT(平方根)函数

2.8三角函数

2.9CEILING(向上取整)函数

2.10FLOOR(向下取整)函数

2.11SQRT(平方根)函数

2.12EXP(指数)函数

2.13LOG(对数)函数

三、字符串函数

3.1字符串函数概述

3.2ASCⅡ(获取ASCⅡ码)函数

3.3CHARINDEX(返回字符串的起始位置)函数

3.4LEFT(取左边指定个数的字符)函数

3.5RIGHT(取右边指定个数的字符)函数

3.6LEN(返回字符个数)函数

3.7REPLACE(替换字符串)函数

3.8REVERSE(返回字符表达式的反转)函数

3.9STR函数

3.10SUBSTRING(取字符串)函数

四、日期和时间函数

4.1日期和时间函数概述

4.2GETDATE(返回当前系统日期和时间)函数

4.3DAY(返回指定日期的天)函数

4.4MONTH(返回指定日期的月)函数

4.5YEAR(返回指定日期的年)函数

4.6DATEDIFF(返回日期和时间的边界数)函数

4.7DATEADD(添加日期时间)函数

4.8DATENAME函数:

4.9DATEPART函数:

4.10CONVERT函数:

4.11FORMAT函数:

五、转换函数

5.1转换函数概述

5.2CAST函数

5.3CONVERT函数

六、元数据函数

6.1元数据函数概述

6.2COL_LENGTH函数

6.3COL_NAME函数

6.4DB_NAME函数


SQL Server 2008提供了各种函数,用于执行各种操作和计算。下面是对各种函数的总结使用。 

一、聚合函数

1.1聚合函数概述

聚合函数对一组值进行计算并返回单一的值,通常聚合函数会与SELECT语句的GROUP BY子句
一同使用
,在与GROUP BY子句使用时,聚合函数会为每一个组产生一个单一值,而不会为整个表产生一个单一值。通过将数据按照一个或多个列进行分组,可以对每个组应用聚合函数,并且为每个组返回一个结果。这样可以汇总数据并提供有关不同组的统计信息。

常用的聚合函数及说明如表所示:

函数名称说明
SUM返回表达式中所有值的和
AVG计算平均值
MIN返回表达式的最小值
MAX返回表达式的最大值
COUNT返回组中项目的数量
DISTINCT返回一个集合,并从指定集合中删除重复的元组

1.2SUM(求和)函数

SUM函数返回表达式中所有值的和或仅非重复值的和。SUM只能用于数字列,空值将被忽略。
语法格式如下:

SUM([ALL | DISTINCT ]expression)

参数说明:

  • ☑ALL:对所有的值应用此聚合函数。ALL是默认值。
  • ☑DISTINCT:指定SUM返回唯一值的和。
  • ☑expression:常量、列名、函数以及算术运算符、位运算符和字符串运算符的任意组合。expression是精确数字或近似数字数据类型类别(bt数据类型除外)的表达式。
  • ☑返回类型:以最精确的expression数据类型返回所有expression值的和。

有关SUM函数使用的几点说明如下:

  • ☑含有索引的字段能够加快聚合函数的运行。
  • ☑字段数据类型为int、smallint、tinyint、decimal、numeric、float、real、money以及smallmoney
  • 的字段才可以使用SUM函数。
  • ☑在使用SUM函数时,SQL Server把结果集中的smallint或tinyint这些数据类型当作int处理。
  • ☑在使用SUM函数时,SQL Server将忽略空值(NULL),即计算时不计算这些空值。

以下是SUM函数的基本语法:

SELECT SUM(column_name) AS sum_value
FROM table_name;

column_name是要计算总和的列名,table_name是包含该列的表名。使用AS关键字可以为结果指定别名(sum_value),以便更容易理解结果。 

例如,假设有一个名为SalesTable的表,包含以下数据:

SalesIDProductQuantity
1A10
2B15
3A20
4C5

使用SUM函数计算Quantity列的总和:

SELECT SUM(Quantity) AS TotalQuantity
FROM SalesTable;

 结果将是:

TotalQuantity
50

此外,SUM函数还可以与其他SQL查询语句结合使用。例如,可以使用WHERE子句进行条件过滤,然后计算满足条件的行的总和。例如,以下查询将计算Product为"A"的销售数量总和: 

SELECT SUM(Quantity) AS TotalQuantity
FROM SalesTable
WHERE Product = 'A';

 返回一个结果集,其中包含Product为"A"的销售数量总和。

1.3AVG(平均值)函数

AVG函数返回组中各值的平均值(将忽略空值)。语法格式如下:

AVG([ALL |DISTINCT ]expression)

参数说明:

  • ☑ALL:对所有的值进行聚合函数运算。ALL是默认值
  • ☑DISTINCT:指定AVG只在每个值的唯一实例上执行,·而不管该值出现了多少次。
  • ☑expression:是精确数值或近似数值数据类别(bit数据类型除外)的表达式。不允许使用聚合函数和子查询。
  • ☑返回类型:由expression的计算结果类型确定。

有关AVG函数使用的几点说明如下:

  • ☑AVG函数不一定返回与传递到函数的列完全相同的数据类型。
  • ☑AVG函数只能用于数据类型是int、smallint、tinyint、decimal、.float、real、money和smallmoney的字段。
  • ☑在使用AVG函数时,SQL Server把结果集中的smallint或tinyint这些数据类型当作int处理。

AVG函数的返回值类型由表达式的运算结果类型决定,如表所示。

表达式结果返回类型
整数分类int
decimal分类(p,s)decimal(38,s)除以decimal(10,0)
money和smallmoney分类money
float和read分类float

以下是AVG函数的基本语法:

SELECT AVG(column_name) AS average_value
FROM table_name;

 column_name是要计算平均值的列名,table_name是包含该列的表名。使用AS关键字可以为结果指定别名(average_value),以便更容易理解结果。

例如,假设有一个名为SalesTable的表,使用AVG函数计算Quantity列的平均值:

SELECT AVG(Quantity) AS AverageQuantity
FROM SalesTable;

结果将是:

AverageQuantity
12.5

 此外,AVG函数还可以与其他SQL查询语句结合使用。例如,可以使用WHERE子句进行条件过滤,然后计算满足条件的行的平均值。例如,以下查询将计算Product为"A"的销售数量平均值:

SELECT AVG(Quantity) AS AverageQuantity
FROM SalesTable
WHERE Product = 'A';

返回一个结果集,其中包含Product为"A"的销售数量平均值。 

1.4MIN(最小值)函数

MIN函数返回表达式中的最小值。语法格式如下:

MIN([ALL| DISTINCT] expression)

参数说明:

  • ☑ALL:对所有的值进行聚合函数运算。ALL是默认值。
  • ☑DISTINCT:指定每个唯一值都被考虑。DISTINCT对于MN无意义,使用它仅是为了符合ISO标准。
  • ☑expression:常量、列名、函数以及算术运算符、位运算符和字符串运算符的任意组合。MN可用于numeric、char、varchar或datetime列,但不能用于bit列。不允许使用聚合函数和子查询。
  • ☑返回类型:返回与expression相同的值。

有关MN函数使用的几点说明如下:

  • ☑MN函数不能用于数据类型是bit的字段。
  • ☑在确定列中的最小值时,MN函数忽略NULL值,但是如果在该列中的所有行都有NULL值,将返回NULL值。
  • ☑不允许使用聚合函数和子查询。

以下是MIN函数的基本语法:

SELECT MIN(column_name) AS min_value
FROM table_name;

 column_name是要查找最小值的列名,table_name是包含该列的表名。使用AS关键字可以为结果指定别名(min_value),以便更容易理解结果。

例如,假设有一个名为SalesTable的表,使用MIN函数找到Quantity列的最小值:

SELECT MIN(Quantity) AS MinQuantity
FROM SalesTable;

结果将是:

MinQuantity
5

 此外,MIN函数还可以与其他SQL查询语句结合使用。例如,可以使用WHERE子句进行条件过滤,然后找到满足条件的行的最小值。例如,以下查询将找到Product为"A"的销售数量的最小值:

SELECT MIN(Quantity) AS MinQuantity
FROM SalesTable
WHERE Product = 'A';

返回一个结果集,其中包含Product为"A"的销售数量的最小值。 

1.5MAX(最大值)函数

 MAX函数返回表达式中的最小值。语法格式如下:

MAX([ALL| DISTINCT] expression)

参数说明:

  • ☑ALL:对所有的值应用此聚合函数。ALL是默认值。
  • ☑DISTINCT:指定考虑每个唯一值。DISTINCT对于MAX无意义,使用它仅是为了与ISO实现兼容。
  • ☑expression:常量、列名、函数以及算术运算符、位运算符和字符串运算符的任意组合。MAX可用于numeric列、character列和datetime列,但不能用于bit列。不允许使用聚合函数和子查询。
  • ☑返回类型:返回与expression相同的值。

有关MAX函数使用的几点说明如下:

  • ☑MAX函数将忽略选取对象中的空值。
  • ☑不能通过MAX函数从bit、text和image数据类型的字段中选取最大值:
  • ☑在SQL Server中,MAX函数可以用于数据类型为数字、字符、datetime的列,但是不能用于数据类型为bit的列。不能使用聚合函数和子查询。
  • ☑对于字符列,MAX查找排序序列的最大值。

以下是MAX函数的基本语法:

SELECT MAX(column_name) AS max_value
FROM table_name;

 例如,假设有一个名为SalesTable的表,使用MAX函数找到Quantity列的最大值:

SELECT MAX(Quantity) AS MaxQuantity
FROM SalesTable;

结果将是:

MaxQuantity
20

 此外,MAX函数还可以与其他SQL查询语句结合使用。例如,可以使用WHERE子句进行条件过滤,然后找到满足条件的行的最大值。例如,以下查询将找到Product为"A"的销售数量的最大值:

SELECT MAX(Quantity) AS MaxQuantity
FROM SalesTable
WHERE Product = 'A';

返回一个结果集,其中包含Product为"A"的销售数量的最大值。 

1.6COUNT(统计)函数

COUNT函数返回组中的项数。COUNT返回int数据类型值。语法格式如下:

COUNT ({[[ALL | DISTINCT ]expression ]|*})

参数说明:

  • ☑ALL:对所有的值进行聚合函数运算。ALL是默认值。
  • ☑DISTINCT:指定COUNT返回唯一非空值的数量。
  • ☑expression:除text、image或ntext以外任何类型的表达式。不允许使用聚合函数和子查询。
  • ☑*:指定应该计算所有行以返回表中行的总数。COUNT(*)不需要任何参数,而且不能与DISTINCT一起使用。COUNT(*)不需要expression参数,因为根据定义,该函数不使用有关任何特定列的信息。COUNT(*)返回指定表中行数而不删除副本。它对各行分别计数,包括包含空值的行。
  • ☑返回类型:int类型。

以下是COUNT函数的基本语法:

SELECT COUNT(column_name) AS count_value
FROM table_name;

 例如,假设有一个名为SalesTable的表,使用COUNT函数统计SalesTable表中的行数:

SELECT COUNT(*) AS RowCount
FROM SalesTable;

结果将是:

RowCount
4

 此外,COUNT函数还可以与其他SQL查询语句结合使用。例如,可以使用WHERE子句进行条件过滤,然后统计满足条件的行数。例如,以下查询将统计Product为"A"的销售数量:

SELECT COUNT(*) AS CountA
FROM SalesTable
WHERE Product = 'A';

返回一个结果集,其中包含Product为"A"的销售数量。

1.6.1COUNT函数用法分类

①统计所有行数(无论列的值是否为NULL):

SELECT COUNT(*) AS TotalRows
FROM table_name;

这种用法会统计指定表中的所有行数,包括具有NULL值的行。 

②统计指定列非空值的行数:

SELECT COUNT(column_name) AS NonNullRows
FROM table_name;

这种用法只会统计指定列非空值的行数,忽略具有NULL值的行。 

③统计满足条件的行数:

SELECT COUNT(*) AS ConditionRows
FROM table_name
WHERE condition;

这种用法会统计满足WHERE子句中指定条件的行数。 

④统计不重复值列名的行数:

SELECT COUNT(DISTINCT column_name) AS count_value
FROM table_name;

这种用法会统计指定列中不重复的值的数量 。

1.6.2COUNT函数用法示例

下面通过一个实际的例子来说明这些用法之间的区别。假设有一个名为EmployeeTable的表,包含以下数据:

EmployeeIDNameDepartment
1JohnSales
2MaryHR
3NULLIT
4PeterSales

使用上述前三种用法来统计EmployeeTable中的行数,并分析它们之间的区别:

①统计所有行数(无论列的值是否为NULL):

SELECT COUNT(*) AS TotalRows
FROM EmployeeTable;

结果是:

②统计Name列非空值的行数: 

SELECT COUNT(Name) AS NonNullRows
FROM EmployeeTable;

结果是: 

③统计Department列为'Sales'的行数:

SELECT COUNT(*) AS ConditionRows
FROM EmployeeTable
WHERE Department = 'Sales';

结果是:

通过以上例子,可以看出不同的COUNT函数用法之间的区别:

  • 使用COUNT(*)时,会统计表中的所有行数,无论列的值是否为NULL。
  • 使用COUNT(column_name)时,只会统计指定列非空值的行数,忽略具有NULL值的行。
  • 使用COUNT(*)结合WHERE子句时,可以根据条件统计满足特定条件的行数。

④统计不重复值列名的行数:

例如,假设有一个名为SalesTable的表,使用COUNT(DISTINCT Product)函数统计SalesTable表中产品的不重复数量:

SELECT COUNT(DISTINCT Product) AS DistinctProducts
FROM SalesTable;

 结果是:

表示SalesTable表中的产品有3个不重复的值。

COUNT(DISTINCT 字段名)函数的区别在于它只统计指定列中的不重复值数量,而不是统计所有行或所有值的数量。它适用于需要计算某一列中独特值的情况,可以帮助用户快速了解数据集中存在的不同种类或分类的数量。 

1.7DISTINCT(取不重复记录)函数

DISTINCT函数对指定的集求值,删除该集中的重复元组,然后返回结果集。语法格式如下:

DISTINCT(Set_Expression)

参数说明:

  • Set_Expression:返回集的有效多维表达式(MDX)。

如果Distinct函数在指定的集中找到了重复的元组,则此函数只保留重复元组的第一个实例,同时保留该集原来的顺序。

以下是DISTINCT函数的基本语法:

SELECT DISTINCT column_name1, column_name2, ...
FROM table_name;

 使用DISTINCT关键字将会返回一组不重复的记录。

例如,假设有一个名为SalesTable的表,包含以下数据:

SalesIDProductQuantity
1A10
2B15
3A20
4C10
5A15

使用DISTINCT函数来选择不重复的Product值:

SELECT DISTINCT Product
FROM SalesTable;

 结果将是:

表示从SalesTable表中选择了不重复的Product值。

DISTINCT函数对于需要筛选出唯一值并且避免重复的情况非常有用。它可用于处理数据中存在重复记录的情况,并帮助用户获取唯一的、不重复的值。

注意:

DISTINCT函数将影响查询的性能,因为它需要对结果进行排序和比较以找到不重复的记录。 

1.8查询重复记录

在查询重复记录时,可以使用以下几种方法:

①使用GROUP BY和HAVING子句:

  • 使用GROUP BY按照指定的列分组,并使用HAVING筛选出出现次数大于1的组。
  • 这将返回包含重复记录的组。

语法格式:

SELECT column_name1, column_name2, ...
FROM table_name
GROUP BY column_name1, column_name2, ...
HAVING COUNT(*) > 1;

②使用子查询和EXISTS关键字:

  • 使用子查询构造一个包含重复记录的结果集,并使用EXISTS关键字来检查是否存在相同的记录。

语法格式:

SELECT column_name1, column_name2, ...
FROM table_name t1
WHERE EXISTS (
    SELECT 1 
    FROM table_name t2
    WHERE t1.column_name1 = t2.column_name1
      AND t1.column_name2 = t2.column_name2
      ...
    GROUP BY column_name1, column_name2, ...
    HAVING COUNT(*) > 1
);

③使用窗口函数ROW_NUMBER():

  • 使用ROW_NUMBER()函数给每个记录分配一个序号,并根据需要进行排序。
  • 然后,选择序号大于1的记录即可获取重复记录。

语法格式: 

SELECT column_name1, column_name2, ...
FROM (
    SELECT column_name1, column_name2, ...,
           ROW_NUMBER() OVER (PARTITION BY column_name1, column_name2, ... ORDER BY column_name1) AS row_num
    FROM table_name
) AS subquery
WHERE row_num > 1;

 示例说明:

创建表OrderTable,并插入数据:

--创建表
CREATE TABLE OrderTable (
    OrderID INT,
    CustomerID INT,
    Product VARCHAR(50),
    Quantity INT
);


--插入数据
INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (1, 1, 'A', 10);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (2, 2, 'B', 15);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (3, 3, 'A', 20);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (4, 4, 'C', 10);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (5, 1, 'A', 15);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (6, 2, 'B', 12);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (7, 3, 'A', 8);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (8, 4, 'D', 5);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (9, 5, 'E', 3);

INSERT INTO OrderTable (OrderID, CustomerID, Product, Quantity)
VALUES (10, 5, 'F', 7);

select * from OrderTable;

表展示:

使用之前提到的三种方法来查询重复记录 :

①使用GROUP BY和HAVING子句:

查询在OrderTable表中出现多次的CustomerID以及它们的重复次数。

SELECT CustomerID, COUNT(*) AS Count
FROM OrderTable
GROUP BY CustomerID
HAVING COUNT(*) > 1;

结果是:

②使用子查询和EXISTS关键字:

返回那些具有重复CustomerID的记录的CustomerID、Product和Quantity

SELECT CustomerID, Product, Quantity
FROM OrderTable t1
WHERE EXISTS (
    SELECT 1 
    FROM OrderTable t2
    WHERE t1.CustomerID = t2.CustomerID
    GROUP BY CustomerID
    HAVING COUNT(*) > 1
);

结果是:

③使用窗口函数ROW_NUMBER():

返回那些具有重复CustomerID和Product组合的记录的CustomerID、Product和Quantity。

SELECT CustomerID, Product, Quantity
FROM (
    SELECT CustomerID, Product, Quantity,
           ROW_NUMBER() OVER (PARTITION BY CustomerID, Product ORDER BY Quantity) AS row_num
    FROM OrderTable
) AS subquery
WHERE row_num > 1;

结果是:

二、数学函数

数学函数能够对数字表达式进行数学运算,并能够将结果返回给用户。默认情况下,传递给数学函数的数字将被解释为双精度浮点数。

2.1数学函数概述

数学函数可以对数据类型为整型(integer)、实型(real)、浮点型(float)、货币型(money)和
smallmoney的列进行操作。数学函数的返回值是6位小数,如果使用出错,则返回NULL值并显示提示信息,通常该函数可以用在SQL语句的表达式中。常用的数学函数及说明如表所示。

函数名称说明
ABS返回指定数字表达式的绝对值
COS返回指定的表达式中指定弧度的三角余弦值
COT返回指定的表达式中指定弧度的三角余切值
PI返回值为圆周率
POWER将指定的表达式乘指定次方
RAND返回0~1之间的随机f1oat数
ROUND将数字表达式四舍五入为指定的长度或精度
SIGN返回指定表达式的零(0)、正号(+1)或负号(-1)
SIN返回指定的表达式中指定弧度的三角正弦值
SQUARE返回指定表达式的平方
SQRT返回指定表达式的平方根
TAN返回指定的表达式中指定弧度的三角正切值

算术函数(如ABS、CEILING、DEGREES、FLOOR、POWER、RADIANS和SIGN)返回与输入值具有相同数据类型的值。三角函数和其他函数(包括EXP、LOG、LOG10、SQUARE和SQRT)将输入值转换为float并返回float值。 

2.2ABS(绝对值)函数

ABS函数用于返回给定数字的绝对值。它接受一个数字作为参数,并返回该数字的非负值。

语法:

ABS(number)
  • number:要计算绝对值的数字。

 示例用法:

SELECT ABS(10) AS AbsoluteValue; -- 返回 10

SELECT ABS(-5) AS AbsoluteValue; -- 返回 5

SELECT ABS(3.14159) AS AbsoluteValue; -- 返回 3.14159

使用ABS函数计算了不同数字的绝对值。无论输入是正数、负数还是小数,ABS函数都会返回其绝对值。

注意,ABS函数也适用于表达式和列名。例如,可以在SELECT语句中使用ABS函数来计算列的绝对值。 

SELECT ABS(column_name) FROM table_name;

这样可以针对表中的指定列计算绝对值并返回相应的结果。 

2.3PI(圆周率)函数

SQL Server 2008 提供了名为 PI() 的内置函数来获取圆周率的值。PI() 函数不需要任何参数,并返回一个浮点数,表示圆周率 π 的近似值。

以下是使用 PI() 函数获取圆周率的示例:

SELECT PI() AS PiValue;

返回一个结果集,其中包含圆周率的近似值。例如,结果可能为 3.14159265358979。 

2.4POWER(乘方)函数

POWER 函数用于计算一个数的指定次幂。它接受两个参数:要进行乘方计算的数字和指定的幂数。

语法:

POWER(number, power)
  • number:要进行乘方计算的数字。
  • power:指定的幂数,即要将数字乘以自身的次数。

示例用法:

SELECT POWER(2, 3) AS Result; -- 返回 8,即 2 的 3 次幂

SELECT POWER(3.14, 2) AS Result; -- 返回 9.8596,即圆周率的平方

SELECT POWER(-2, 4) AS Result; -- 返回 16,即 -2 的 4 次幂

使用 POWER 函数对不同数字进行了乘方运算。第一个示例计算了 2 的 3 次幂,即 2 * 2 * 2,结果为 8。第二个示例计算了圆周率(3.14)的平方,结果为 9.8596。第三个示例计算了 -2 的 4 次幂,即 -2 * -2 * -2 * -2,结果为 16。

注意,POWER 函数也适用于表达式和列名。例如,可以在 SELECT 语句中使用 POWER 函数来计算某个列的乘方值。

SELECT POWER(column_name, power) FROM table_name;

可以针对表中的指定列进行乘方计算并返回相应的结果。 

2.5RAND(随机浮点数)函数

RAND() 函数用于生成一个随机浮点数。它不需要任何参数,并返回一个介于 0 和 1 之间的伪随机数。

语法:

RAND()

示例用法:

SELECT RAND() AS RandomNumber;

返回一个结果集,其中包含一个随机生成的浮点数。每次执行查询时,都会生成一个不同的随机数。

如果要生成一个指定范围内的随机数,可以使用一些数学运算来进行调整。例如,要生成一个介于 10 和 50 之间的随机整数,可以使用以下查询:

SELECT FLOOR(RAND() * 41 + 10) AS RandomIntegerInRange;

使用 FLOOR 函数将随机数乘以 41(范围的大小),然后加上 10(范围的起始值),最后将结果向下取整,得到一个介于 10 和 50 之间的随机整数。

注意:

由于 RAND() 函数是伪随机的,所以每次执行查询时都会生成一个新的随机数。如果需要在查询中多次使用相同的随机数,请将 RAND() 的结果保存到变量中,以便在查询中引用。

2.6ROUND(四舍五入)函数

ROUND 函数用于将一个数字四舍五入到指定的小数位数。它接受两个参数:要进行四舍五入的数字和指定的小数位数。

语法:

ROUND(number, decimals)
  • number:要进行四舍五入处理的数字。
  • decimals:指定的小数位数,即要保留的小数位数。

示例用法:

SELECT ROUND(3.14159, 2) AS RoundedValue; -- 返回 3.14

SELECT ROUND(6.789, 0) AS RoundedValue; -- 返回 7

SELECT ROUND(1234.56789, -2) AS RoundedValue; -- 返回 1200

使用 ROUND 函数对不同的数字进行了四舍五入操作。第一个示例将圆周率值 3.14159 四舍五入到小数点后两位,结果为 3.14。第二个示例将数字 6.789 四舍五入到整数,结果为 7。第三个示例将数字 1234.56789 四舍五入到百位,结果为 1200。

注意,ROUND 函数也适用于表达式和列名。例如,可以在 SELECT 语句中使用 ROUND 函数来对某个列的值进行四舍五入。

SELECT ROUND(column_name, decimals) FROM table_name;

可以对表中的指定列进行四舍五入,并返回相应的结果。 

ROUND 函数采用标准的四舍五入规则,即当给定数字的小数部分等于或大于 0.5 时,将向上取整;小于 0.5 时,将向下取整。

2.7SQUARE(平方)函数和SQRT(平方根)函数

①SQUARE 函数:

用于计算给定数值的平方。它接受一个参数,即要进行平方计算的数字。

语法:

SQUARE(number)

示例用法:

SELECT SQUARE(2) AS SquareValue; -- 返回 4

SELECT SQUARE(5.5) AS SquareValue; -- 返回 30.25

SELECT SQUARE(-3) AS SquareValue; -- 返回 9

使用 SQUARE 函数对不同数字进行了平方计算。第一个示例计算了数字 2 的平方,结果为 4。第二个示例计算了数字 5.5 的平方,结果为 30.25。第三个示例计算了数字 -3 的平方,结果为 9。

②SQRT 函数:

用于计算给定数值的平方根。它接受一个参数,即要进行平方根计算的数字。

语法:

SQRT(number)

示例用法:

SELECT SQRT(16) AS SquareRootValue; -- 返回 4

SELECT SQRT(2.25) AS SquareRootValue; -- 返回 1.5

SELECT SQRT(1000) AS SquareRootValue; -- 返回 31.6227766016838

使用 SQRT 函数对不同数字进行了平方根计算。第一个示例计算了数字 16 的平方根,结果为 4。第二个示例计算了数字 2.25 的平方根,结果为 1.5。第三个示例计算了数字 1000 的平方根,结果为 31.6227766016838。

注意,这些函数也适用于表达式和列名。例如,可以在 SELECT 语句中使用 SQUARE 和 SQRT 函数来对某个列的数值进行平方和平方根计算。

SELECT SQUARE(column_name) FROM table_name;

SELECT SQRT(column_name) FROM table_name;

可以对表中的指定列进行平方或平方根计算,并返回相应的结果。 

2.8三角函数

①SIN 函数:用于计算给定角度(以弧度为单位)的正弦值。

语法:

SIN(angle)

②COS 函数:用于计算给定角度(以弧度为单位)的余弦值。

语法:

COS(angle)

③TAN 函数:用于计算给定角度(以弧度为单位)的正切值。

语法:

TAN(angle)

④ASIN 函数:用于计算给定值的反正弦值,返回的结果是一个介于 -π/2 和 π/2 之间的角度(以弧度为单位)。

语法:

ASIN(value)

⑤ATAN 函数:用于计算给定值的反正切值,返回的结果是一个介于 -π/2 和 π/2 之间的角度(以弧度为单位)。

语法:

ACOS(value)

⑥ATAN 函数:用于计算给定值的反正切值,返回的结果是一个介于 -π/2 和 π/2 之间的角度(以弧度为单位)。

语法:

ATAN(value)

注意:

这些函数中的角度参数都需要以弧度为单位。如果想要使用角度作为输入,可以使用其他函数将角度转换为弧度值(如 RADIAN 函数)。 

示例用法:

SELECT SIN(0) AS SineValue; -- 返回 0,即 sin(0)

SELECT COS(PI()) AS CosineValue; -- 返回 -1,即 cos(π)

SELECT TAN(PI()/4) AS TangentValue; -- 返回 1,即 tan(π/4)

SELECT ASIN(0.5) AS ArcSineValue; -- 返回 0.523598775598299,即 asin(0.5)

SELECT ACOS(-0.5) AS ArcCosineValue; -- 返回 2.0943951023932,即 acos(-0.5)

SELECT ATAN(1) AS ArcTangentValue; -- 返回 0.785398163397448,即 atan(1)

以上示例展示了不同三角函数的用法和计算结果。在实际应用中,可以根据具体需求使用适当的三角函数来进行数值计算。 

2.9CEILING(向上取整)函数

CEILING 函数用于将一个数值向上取整为最接近且大于等于原始值的整数。它返回一个与原始值类型相同的整数或浮点数。

以下是 CEILING 函数的语法:

CEILING ( numeric_expression )
  • numeric_expression:要进行向上取整的数值表达式。

CEILING 函数将提供的数值表达式向上取整,并返回结果。

以下是一些示例,说明如何使用 CEILING 函数:

①向上取整为整数:

SELECT CEILING(3.7) AS Result;

运行以上代码,将获得如下结果: 

表示将数值表达式 3.7 向上取整为最接近且大于等于原始值的整数,结果为 4。 

②向上取整为浮点数: 

SELECT CEILING(3.14159 * 100) / 100.0; -- 返回 3.15,将 3.14159 向上取整到两位小数,即 3.15

运行以上代码,将获得如下结果: 

需要向上取整获得具有多个小数位的浮点数,可以根据需要使用 ROUND() 函数来控制小数位数。 

注意:

在某些情况下,向上取整可能会导致结果超过原始值,这是因为向上取整总是返回大于或等于原始值的最小整数或浮点数。 

2.10FLOOR(向下取整)函数

FLOOR 函数用于将一个数值向下取整为最接近且小于等于原始值的整数。它返回一个与原始值类型相同的整数或浮点数。

以下是 FLOOR 函数的语法:

FLOOR ( numeric_expression )
  • numeric_expression:要进行向下取整的数值表达式。

FLOOR 函数将提供的数值表达式向下取整,并返回结果。

以下示例,说明如何使用 FLOOR 函数: 

向下取整为整数:

SELECT FLOOR(3.7) AS Result;

运行以上代码,将获得如下结果: 

 

2.11SQRT(平方根)函数

SQRT 函数用于计算给定数值的平方根。它返回一个与原始值类型相同的浮点数。

以下是 SQRT 函数的语法:

SQRT ( numeric_expression )
  • numeric_expression:要计算平方根的数值表达式。

SQRT 函数将提供的数值表达式进行平方根运算,并返回结果作为浮点数。

以下是一些示例,说明如何使用 SQRT 函数:

①计算整数的平方根:

SELECT SQRT(16) AS Result;

运行以上代码,将获得如下结果:

 

②计算浮点数的平方根: 

SELECT SQRT(25.5) AS Result;

 运行以上代码,将获得如下结果:

注意:

SQRT 函数只能用于非负数,因为平方根仅适用于非负实数范围。如果尝试对负数应用 SQRT 函数,将会报错。 

2.12EXP(指数)函数

EXP 函数用于计算给定数值的指数(自然指数,以e为底)。它返回一个与原始值类型相同的浮点数。

以下是 EXP 函数的语法:

EXP ( numeric_expression )
  • numeric_expression:要计算指数的数值表达式。

EXP 函数将提供的数值表达式作为指数运算,并返回结果作为浮点数。

以下是一个示例,说明如何使用 EXP 函数:

SELECT EXP(2) AS Result;

 运行以上代码,将获得类似以下结果:

注意:

指数函数 EXP 使用的是自然常数 e (约等于2.71828)作为底数。因此,EXP(x) 的计算结果就是 e 的 x 次方。 

2.13LOG(对数)函数

LOG 函数用于计算给定数值的对数。它返回一个与原始值类型相同的浮点数。

以下是 LOG 函数的语法:

LOG ( float_expression [ , base ] )
  • float_expression:要计算对数的数值表达式。
  • base(可选):指定对数的底数,默认为自然对数(以e为底)。

LOG 函数将提供的数值表达式进行对数运算,并返回结果作为浮点数。

以下是一个示例,说明如何使用 LOG 函数:

计算自然对数(以e为底):

SELECT LOG(10) AS Result;

运行以上代码,将获得类似以下结果: 

 

在 SQL Server 2008 中,LOG 函数不支持直接指定底数。它只计算给定数值的自然对数(以e为底)。在 SQL Server 2012 及更高版本中,引入了 LOG 函数的第二个参数用于指定底数。但在 SQL Server 2008 中,此功能不可用。

 对于其他底数的对数计算,可以使用换底公式来实现,如下所示:

SELECT LOG(100) / LOG(10) AS Result;

结果为 :

 

三、字符串函数

字符串函数对N进制数据、字符串和表达式执行不同的运算,如返回字符串的起始位置,返回字
符串的个数等。

3.1字符串函数概述

字符串函数作用于char、varchar、binary和varbinary数据类型以及可以隐式转换为char或varchar
的数据类型,通常字符串函数可以用在SQL语句的表达式中。常用的字符串函数及说明如表所示。

函数名称说明
ASCII返回字符表达式最左端字符的ASCI代码值
CHARINDEX返回字符串中指定表达式的起始位置
LEFT从左边开始,取得字符串左边指定个数的字符
LEN返回指定字符串的字符(而不是字节)个数
REPLACE将指定的字符串替换为另一指定的字符串
REVERSE返回字符表达式的反转
RIGHT从右边开始,取得字符串右边指定个数的字符
STR返回由数字数据转换来的字符数据
SUBSTRING返回指定个数的字符

3.2ASCⅡ(获取ASCⅡ码)函数

使用ASCII函数来获取字符的ASCII码。ASCII函数接受一个参数,该参数可以是任何字符、表达式或列名,并返回对应字符的ASCII码值。

以下是使用ASCII函数获取ASCⅡ码的示例:

SELECT ASCII('A') AS ASC_Code;

返回字符'A'的ASCII码值,即65。

ASCI码共有127个,其中Microsoft Windows不支持1~7、11~12和14~31之间的字符。值8、9、10和13分别转换为退格、制表、换行和回车字符,它们并没有特定的图形显示,但会依不同的应用程序而对文本显示有不同的影响。 

ASCII函数在较新版本的SQL Server中仍然有效,但已从SQL Server 2017开始被推荐使用UNICODE函数来代替。

 ASCII值对照表如下所示:

比如使用ASCI函数返回NXT的ASCI代码值。SQL语句及运行结果 如下:

--使用ASCII函数分别对每个字符进行处理:
SELECT ASCII('N') AS ASC_Code_N,
       ASCII('X') AS ASC_Code_X,
       ASCII('T') AS ASC_Code_T;


--动态SQL:
DECLARE @str NVARCHAR(50) = 'NXT';
DECLARE @sql NVARCHAR(MAX) = '';
DECLARE @char NVARCHAR(1);
DECLARE @i INT = 1;

WHILE @i <= LEN(@str)
BEGIN
    SET @char = SUBSTRING(@str, @i, 1);
    SET @sql = @sql + 'SELECT ASCII(''' + @char + ''') AS ASC_Code' + @char + '; ';
    SET @i = @i + 1;
END

EXEC(@sql);

--或
DECLARE @position int,@string char (3)
SET @position = 1
SET @string = 'NXT'
WHILE @position<=DATALENGTH(@string)
   BEGIN
   SELECT ASCII(SUBSTRING (@string,@position,1))AS ASCII值,
     CHAR (ASCII (SUBSTRING(@string,@position,1)))AS 字符
SET @position =@position +1
END

运行以上代码,将获得如下结果:

表示字符'N'的ASCII码值为78,字符'X'的ASCII码值为88,字符'T'的ASCII码值为84。 

3.3CHARINDEX(返回字符串的起始位置)函数

使用CHARINDEX函数来查找一个字符串在另一个字符串中的起始位置。该函数接受三个参数:要查找的字符串、被搜索的字符串以及起始搜索位置(可选,默认为1)。

以下是CHARINDEX函数的语法:

CHARINDEX(search_string, expression [, start_location])
  • search_string:要查找的字符串。
  • expression:被搜索的字符串。
  • start_location(可选):指定从哪个位置开始搜索,默认为1。

 CHARINDEX函数返回要查找的字符串在被搜索字符串中的第一个匹配位置。如果找到了匹配项,则返回一个大于等于1的整数值。如果没有找到匹配项,则返回0。

下面是一个示例,说明如何使用CHARINDEX函数:

例1:查找字符串中的子字符串

DECLARE @string VARCHAR(50) = 'Hello, World!';
DECLARE @searchString VARCHAR(10) = 'World';

SELECT CHARINDEX(@searchString, @string) AS Start_Position;

运行以上代码,将获得如下结果: 

表示字符串'World'在被搜索的字符串'Hello, World!'中的起始位置是第8个字符。

例2:查找多个匹配项的起始位置

如果我们想要查找字符串中多个匹配项的起始位置,可以使用循环结合 CHARINDEX 函数。 

DECLARE @string VARCHAR(50) = 'Hello, Hello, Hello';
DECLARE @searchString VARCHAR(10) = 'Hello';
DECLARE @startPos INT = 1;

WHILE @startPos > 0
BEGIN
    SET @startPos = CHARINDEX(@searchString, @string, @startPos);
    
    IF @startPos > 0
    BEGIN
        PRINT 'Found at position: ' + CAST(@startPos AS VARCHAR);
        SET @startPos = @startPos + 1;
    END
END

输出:

  

3.4LEFT(取左边指定个数的字符)函数

使用 LEFT 函数来截取一个字符串的左边指定个数的字符。该函数接受两个参数:要截取的字符串和要截取的字符数。

以下是 LEFT 函数的语法:

LEFT (expression, length)
  • expression:要截取的字符串。
  • length:要截取的字符数。

LEFT 函数返回被截取字符串的左边指定个数的字符。

下面是一个示例,说明如何使用 LEFT 函数:

DECLARE @string VARCHAR(50) = 'Hello, World!';
DECLARE @characters INT = 5;

SELECT LEFT(@string, @characters) AS Left_Side;

运行以上代码,将获得如下结果: 

表示从字符串 'Hello, World!' 的左边截取了前 5 个字符。 

3.5RIGHT(取右边指定个数的字符)函数

使用 RIGHT 函数来截取一个字符串的右边指定个数的字符。该函数接受两个参数:要截取的字符串和要截取的字符数。

以下是 RIGHT 函数的语法:

RIGHT (expression, length)
  • expression:要截取的字符串。
  • length:要截取的字符数。

RIGHT 函数返回被截取字符串的右边指定个数的字符。

下面是一个示例,说明如何使用 RIGHT 函数:

DECLARE @string VARCHAR(50) = 'Hello, World!';
DECLARE @characters INT = 6;

SELECT RIGHT(@string, @characters) AS Right_Side;

运行以上代码,将获得如下结果:

 

表示从字符串 'Hello, World!' 的右边截取了后 6 个字符。 

3.6LEN(返回字符个数)函数

使用 LEN 函数来获取一个字符串的字符个数。该函数接受一个参数:要计算长度的字符串。

以下是 LEN 函数的语法:

LEN (expression)
  • expression:要计算长度的字符串。

LEN 函数返回给定字符串中的字符个数。

下面是一个示例,说明如何使用 LEN 函数:

DECLARE @string VARCHAR(50) = 'Hello, World!';

SELECT LEN(@string) AS String_Length;

 运行以上代码,将获得如下结果:

表示获取了字符串 'Hello, World!' 的字符个数,即 13 个字符。 

3.7REPLACE(替换字符串)函数

使用 REPLACE 函数来替换一个字符串中的指定子字符串。该函数接受三个参数:原始字符串、要替换的子字符串以及替换后的新字符串。

以下是 REPLACE 函数的语法:

REPLACE (string_expression, search_string, replacement_string)
  • string_expression:原始字符串。
  • search_string:要替换的子字符串。
  • replacement_string:替换后的新字符串。

REPLACE 函数会在原始字符串中搜索出现的所有 search_string,并将其替换为 replacement_string

下面是一个示例,说明如何使用 REPLACE 函数:

DECLARE @string VARCHAR(50) = 'Hello, World!';
DECLARE @searchString VARCHAR(10) = 'World';
DECLARE @replaceString VARCHAR(10) = 'Universe';

SELECT REPLACE(@string, @searchString, @replaceString) AS Modified_String;

 运行以上代码,将获得如下结果:

表示将字符串 'Hello, World!' 中的子字符串 'World' 替换为 'Universe',得到了修改后的字符串 'Hello, Universe!'。 

3.8REVERSE(返回字符表达式的反转)函数

使用 REVERSE 函数来反转一个字符串的顺序。该函数接受一个参数:要反转的字符表达式。

以下是 REVERSE 函数的语法:

REVERSE (string_expression)
  • string_expression:要反转的字符串或列。

REVERSE 函数会按相反的顺序返回给定字符表达式的内容。

下面是一个示例,说明如何使用 REVERSE 函数:

DECLARE @string VARCHAR(50) = 'Hello, World!';

SELECT REVERSE(@string) AS Reversed_String;

运行以上代码,将获得如下结果: 

表示对字符串 'Hello, World!' 进行了反转,得到了 '!dlroW ,olleH'。 

3.9STR函数

STR 函数用于将数字或浮点数转换为字符串形式。该函数接受两个或三个参数:要转换的数值、可选的指定总位数和小数位数。

以下是 STR 函数的语法:

STR (float_expression, [total_length], [decimal_places])
  • float_expression:要转换为字符串的数字或浮点数。
  • total_length:(可选)生成的字符串的总长度。如果省略,则根据输入的数值自动确定合适的长度。
  • decimal_places:(可选)生成的字符串中保留的小数位数。如果省略,则默认保留所有小数位数。

STR 函数将数值转换为字符串,并使用必要的填充和格式化选项来生成结果。

下面是一个示例,说明如何使用 STR 函数:

DECLARE @number FLOAT = 1234.567;

SELECT STR(@number, 10, 2) AS Converted_String;

运行以上代码,将获得如下结果: 

 

表示将浮点数 1234.567 转换为字符串,并指定总长度为 10 个字符,小数位数为 2。 

3.10SUBSTRING(取字符串)函数

使用 SUBSTRING 函数从一个字符串中提取指定的子字符串。该函数接受三个参数:原始字符串、要提取的子字符串的起始位置和要提取的字符数。

以下是 SUBSTRING 函数的语法:

SUBSTRING (string_expression, start, length)
  • string_expression:原始字符串。
  • start:要提取的子字符串的起始位置。
  • length:要提取的字符数。

SUBSTRING 函数返回从原始字符串中从指定起始位置开始的指定字符数的子字符串。

下面是一个示例,说明如何使用 SUBSTRING 函数:

DECLARE @string VARCHAR(50) = 'Hello, World!';
DECLARE @startPos INT = 8;
DECLARE @length INT = 5;

SELECT SUBSTRING(@string, @startPos, @length) AS Substring;

运行以上代码,将获得如下结果: 

 

表示从字符串 'Hello, World!' 的第 8 个字符位置开始提取了 5 个字符,得到了子字符串 'World'。 

四、日期和时间函数

日期和时间函数主要用来显示有关日期和时间的信息。在日期和时间函数中,DAY函数、MONTH
函数、YEAR函数用来获取时间和日期部分的函数。DATEDIF℉函数用来获取日期和时间差的函数,DATEADD函数用来修改日期和时间值的函数。

4.1日期和时间函数概述

日期和时间函数主要用来操作datetime、smalldatetime类型的数据,日期和时间函数执行算术运行
与其他函数一样,也可以在SQL语句的SELECT、WHERE子句以及表达式中使用。常用的日期时间函数及说明如表所示。

函数名称说明
DATEADD在向指定日期加上一段时间的基础上,返回新的datetime值
DATEDIFF返回跨两个指定日期的日期和时间边界数
GETDATE返回当前系统日期和时间
DAY返回指定日期中的天的整数
MONTH返回指定日期中的月份的整数
YEAR返回指定日期中的年份的整数

4.2GETDATE(返回当前系统日期和时间)函数

使用 GETDATE 函数来获取当前系统的日期和时间。该函数不接受任何参数。

以下是 GETDATE 函数的语法:

GETDATE()

GETDATE 函数返回一个包含当前系统日期和时间的 datetime 类型值。

下面是一个示例,说明如何使用 GETDATE 函数:

SELECT GETDATE() AS Current_DateTime;

 运行以上代码,将获得类似以下结果:

表示获取了当前系统的日期和时间。每次调用 GETDATE 函数都会返回当前系统的最新日期和时间,因此结果可能会因为执行时间而不同。 

4.3DAY(返回指定日期的天)函数

使用 DAY 函数来获取指定日期的天数部分。该函数接受一个参数:要提取天数的日期。

以下是 DAY 函数的语法:

DAY (date)
  • date:要提取天数的日期。

DAY 函数返回给定日期的天数部分。

下面是一个示例,说明如何使用 DAY 函数:

DECLARE @date DATE = '2022-10-17';

SELECT DAY(@date) AS Day_Number;

 运行以上代码,将获得如下结果:

表示从日期 '2022-10-17' 中提取了天数部分,即 17 号。 

4.4MONTH(返回指定日期的月)函数

使用 MONTH 函数来获取指定日期的月份部分。该函数接受一个参数:要提取月份的日期。

以下是 MONTH 函数的语法:

MONTH (date)
  • date:要提取月份的日期。

MONTH 函数返回给定日期的月份部分,范围从 1 到 12。

下面是一个示例,说明如何使用 MONTH 函数:

DECLARE @date DATE = '2022-10-17';

SELECT MONTH(@date) AS Month_Number;

 运行以上代码,将获得如下结果:

表示从日期 '2022-10-17' 中提取了月份部分,即 10 月。 

4.5YEAR(返回指定日期的年)函数

使用 YEAR 函数来获取指定日期的年份部分。该函数接受一个参数:要提取年份的日期。

以下是 YEAR 函数的语法:

YEAR (date)
  • date:要提取年份的日期。

YEAR 函数返回给定日期的年份部分。

下面是一个示例,说明如何使用 YEAR 函数:

DECLARE @date DATE = '2022-10-17';

SELECT YEAR(@date) AS Year_Number;

 运行以上代码,将获得如下结果:

表示从日期 '2022-10-17' 中提取了年份部分,即 2022 年。 

4.6DATEDIFF(返回日期和时间的边界数)函数

使用 DATEDIFF 函数来计算两个日期或时间之间的差距。该函数接受三个参数:时间间隔单位、开始日期或时间以及结束日期或时间。

以下是 DATEDIFF 函数的语法:

DATEDIFF (datepart, startdate, enddate)
  • datepart:时间间隔单位,可以是年份(year)、季度(quarter)、月份(month)、周数(week)、天数(day)、小时数(hour)、分钟数(minute)或秒数(second)。
  • startdate:开始日期或时间。
  • enddate:结束日期或时间。

DATEDIFF 函数根据给定的时间间隔单位计算并返回开始日期或时间和结束日期或时间之间的边界数。

下面是一个示例,说明如何使用 DATEDIFF 函数:

DECLARE @startdate DATE = '2022-01-01';
DECLARE @enddate DATE = '2022-12-31';

SELECT DATEDIFF(MONTH, @startdate, @enddate) AS Month_Difference;

 运行以上代码,将获得如下结果:

表示计算了从日期 '2022-01-01' 到日期 '2022-12-31' 之间的月份差异,得到了 11 个月。

同样如下找天数差异: 

DECLARE @startdate DATE = '2022-01-01';
DECLARE @enddate DATE = '2022-12-31';

SELECT DATEDIFF(DAY, @startdate, @enddate) AS Month_Difference;

 运行以上代码,将获得如下结果:

表示计算了从日期 '2022-01-01' 到日期 '2022-12-31' 之间的天数差异,得到了 364天。 

4.7DATEADD(添加日期时间)函数

使用 DATEADD 函数来添加指定的时间间隔到给定的日期或时间。该函数接受三个参数:时间间隔单位、要添加的数值以及开始日期或时间。

以下是 DATEADD 函数的语法:

DATEADD (datepart, number, date)
  • datepart:时间间隔单位,可以是年份(year)、季度(quarter)、月份(month)、周数(week)、天数(day)、小时数(hour)、分钟数(minute)或秒数(second)。
  • number:要添加的数值,表示要添加的时间间隔数量。
  • date:开始日期或时间。

DATEADD 函数根据给定的时间间隔单位和数值将其添加到开始日期或时间,并返回计算后的日期或时间。

下面是一个示例,说明如何使用 DATEADD 函数:

DECLARE @startdate DATE = '2022-01-01';
DECLARE @monthsToAdd INT = 3;

SELECT DATEADD(MONTH, @monthsToAdd, @startdate) AS NewDate;

 运行以上代码,将获得如下结果:

表示将开始日期 '2022-01-01' 添加了 3 个月,得到了新的日期 '2022-04-01'

4.8DATENAME函数:

DATENAME 函数用于返回指定日期部分的名称。该函数接受两个参数:日期部分和日期。

以下是 DATENAME 函数的语法:

DATENAME (datepart, date)
  • datepart:要返回名称的日期部分,如年份(year)、月份(month)、天数(day)等。
  • date:要从中提取日期部分的日期。

DATENAME 函数返回给定日期的指定日期部分的名称。

下面是一个示例,说明如何使用 DATENAME 函数:

DECLARE @date DATETIME = '2022-10-17';

SELECT DATENAME(YEAR, @date) AS Year_Name,
       DATENAME(MONTH, @date) AS Month_Name,
       DATENAME(DAY, @date) AS Day_Name;

 运行以上代码,将获得类似以下结果:

表示从日期 '2022-10-17' 中提取了年份、月份和星期几的名称。 

4.9DATEPART函数:

DATEPART 函数用于提取指定日期部分的整数值。它可以从日期和时间类型的表达式中获取年份、月份、日等特定的日期部分。

以下是 DATEPART 函数的语法:

DATEPART(datepart, date)
  • datepart:要提取的日期部分,如年份(year)、月份(month)、天数(day)等。
  • date:要从中提取日期部分的日期或时间表达式。

DATEPART 函数返回指定日期部分的整数值。

以下是一些示例,说明如何使用 DATEPART 函数:

①提取年份:

SELECT DATEPART(YEAR, '2022-10-17') AS YearPart;

运行以上代码,将获得如下结果:

表示从日期 '2022-10-17' 中提取了年份的整数值。 

②提取月份:

SELECT DATEPART(MONTH, GETDATE()) AS MonthPart;

运行以上代码,将获得如下结果: 

表示从当前日期中提取了月份的整数值。 

4.10CONVERT函数:

CONVERT 函数用于将一个表达式转换为指定的数据类型。它通常用于日期、时间和字符串之间的转换,以及不同数据类型之间的转换。

以下是 CONVERT 函数的语法:

CONVERT (data_type, expression [, style])
  • data_type:要将表达式转换为的目标数据类型。
  • expression:要进行转换的表达式或列名。
  • style(可选):用于指定日期和时间格式的样式代码。

CONVERT 函数根据指定的数据类型将表达式转换为相应的数据类型,并返回转换后的值。

下面是一些示例,说明如何使用 CONVERT 函数:

①将字符串转换为日期类型:

DECLARE @dateString VARCHAR(10) = '2022-10-17';
SELECT CONVERT(DATE, @dateString) AS ConvertedDate;

运行以上代码,将获得如下结果:

 

这表示将字符串 '2022-10-17' 转换为日期类型。

②将日期转换为字符串类型: 

DECLARE @date DATE = GETDATE();
SELECT CONVERT(VARCHAR(10), @date, 101) AS ConvertedString;

运行以上代码,将获得如下结果: 

表示将当前日期转换为字符串类型,并使用样式代码 101 格式化'MM/DD/YYYY' 的形式。

下表为日期样式代码表:

③使用字符串操作函数自定义日期和时间格式 

DECLARE @date DATETIME = GETDATE();
SELECT RIGHT(CONVERT(VARCHAR(20), @date, 100), 7) AS FormattedDateTime;

运行以上代码,将获得类似以下结果 :

表示将当前日期时间转换为字符串类型,并使用右侧函数 RIGHT 和子字符串提取来获取时间部分。 

注意:

CONVERT 函数需要进行明确的类型转换,并且在某些情况下可能会导致数据截断或不准确的结果。如果需要更复杂的类型转换操作,还可以考虑使用 CAST 函数来实现更灵活的转换。

4.11FORMAT函数:

FORMAT 函数用于将日期、时间和数字数据格式化为特定的字符串表示形式。它提供了更灵活和直观的方式来格式化数据,使其与特定的地区设置和语言习惯相匹配。

以下是 FORMAT 函数的语法:

FORMAT (value, format [, culture])
  • value:要进行格式化的值,可以是日期、时间或数字。
  • format:指定要应用的格式模式的字符串。这可以是内置的格式模式,也可以是自定义的格式模式。
  • culture(可选):指定要应用的文化区域设置。如果未指定,则使用当前会话的文化区域设置。

FORMAT 函数根据指定的格式模式和文化区域设置将值格式化为字符串,并返回格式化后的结果。

以下是一些示例,说明如何使用 FORMAT 函数:

①格式化日期:

SELECT FORMAT(GETDATE(), 'MM/dd/yyyy') AS FormattedDate;

运行以上代码,将获得如下结果: 

FormattedDate

-------------

10/17/2022

表示使用格式模式 'MM/dd/yyyy' 将当前日期格式化为字符串。

②格式化数字:

SELECT FORMAT(1234567.89, 'N2') AS FormattedNumber;

运行以上代码,将获得如下结果:

FormattedNumber

---------------

1,234,567.89 

表示使用格式模式 'N2' 将数字格式化为带有千位分隔符和两位小数的字符串。

注意:

FORMAT 函数是在 SQL Server 2012 版本中引入的,因此在较旧的版本中可能不可用。

比如2008版本就无法识别该函数:

五、转换函数

如果SQL Server没有自动执行数据类型的转换,可以使用CAST和CONVERT转换函数将一种数据类型的表达式转换为另一种数据类型的表达式。例如,如果比较char和datetim㎡e表达式、smallint和int表达式或不同长度的char表达式,则SQL Server自动对这些表达式进行转换。

5.1转换函数概述

当遇到类型转换的问题时,可以使用SQL Server所提供的CAST和CONVERT函数。这两种函数不但可以将指定的数据类型转换为另一种数据类型,还可用来获得各种特殊的数据格式。CAST和
CONVERT函数都可用于选择列表、WHERE子句和允许使用表达式的任何地方。

在SQL Server中数据类型转换分为两种,分别如下。

  • ☑隐性转换:SQL Server自动处理某些数据类型的转换。例如,如果比较char和datetime表达式、smallint和int表达式,或不同长度的char表达式,SQL Server可将它们自动转换,这种转换称为隐性转换,对这些转换不必使用CAST函数。
  • ☑显式转换:显式转换是指CAST和CONVERT函数将数值从一种数据类型(局部变量、列或其他表达式)转换到另一种数据类型。

隐性转换对用户是不可见的,SQL Server自动将数据从一种数据类型转换成另一种数据类型。例如,如果一个smallint变量和一个int变量相比较,这个smallint变量在比较前即被隐性转换成int变量。

有关转换函数使用的几点说明如下:

  • ☑CAST函数基于SQL-92标准并且优先于CONVERT。
  • ☑当从一个SQL Server对象的数据类型向另一个数据类型转换时,一些隐性和显式数据类型转换是不支持的。例如,nchar数值根本就不能被转换成image数值。nchar只能显式地转换成binary,隐性地转换到binary是不支持的。nchar可以显式地或者隐性地转换成nvarchar。
  • ☑当处理sql variant数据类型时,SQL Server支持将具有其他数据类型的对象隐性转换成sql variant类型。然而,SQL Server并不支持从sql variant数据类型隐性地转换到其他数据类型的对象。 

5.2CAST函数

CAST 函数用于将一个表达式转换为指定的数据类型。它提供了一种显式地将一个数据类型转换为另一个数据类型的方式。

以下是 CAST 函数的语法:

CAST (expression AS data_type)
  • expression:要进行转换的表达式或列名。
  • data_type:要将表达式转换为的目标数据类型。

CAST 函数根据指定的数据类型将表达式转换为相应的数据类型,并返回转换后的值。

以下是一些示例,说明如何使用 CAST 函数:

①将字符串转换为整数类型:

SELECT CAST('123' AS INT) AS ConvertedValue;

运行以上代码,将获得如下结果: 

表示将字符串 '123' 转换为整数类型。

②将浮点数转换为字符串类型:

SELECT CAST(3.14159 AS VARCHAR(7)) AS ConvertedString;

运行以上代码,将获得如下结果: 

表示将浮点数 3.14159 转换为字符串类型,并指定最大长度为 7。 

5.3CONVERT函数

如4.10所讲,CONVERT 函数用于将一个表达式转换为指定的数据类型。但是它提供了一种显式地将一个数据类型转换为另一个数据类型的方式。

以下是 CONVERT 函数的语法:

CONVERT (data_type, expression [, style])
  • data_type:要将表达式转换为的目标数据类型。
  • expression:要进行转换的表达式或列名。
  • style(可选):对于某些数据类型(如日期和时间),可以使用样式参数指定特定的格式。

CONVERT 函数根据指定的数据类型将表达式转换为相应的数据类型,并返回转换后的值。

同4.10所讲,内容一样,以下是一些示例,说明如何使用 CONVERT 函数:

①将字符串转换为整数类型:

SELECT CONVERT(INT, '123') AS ConvertedValue;

运行以上代码,将获得如下结果:

 

表示将字符串 '123' 转换为整数类型。 

②将日期转换为不同的格式:

SELECT CONVERT(VARCHAR(10), GETDATE(), 101) AS FormattedDate;

运行以上代码,将获得如下结果: 

表示将当前日期转换为字符串类型,并使用样式代码 101 格式化为 'MM/DD/YYYY' 的形式。 

六、元数据函数

元数据函数主要是返回与数据库相关的信息,下面是常用的元数据函数COL_LENGTH函数、
COL_NAME函数和DB_NAME函数。

6.1元数据函数概述

元数据函数描述了数据的结构和意义,它主要用于返回数据库中的相应信息,其中包括:

  • ☑返回数据库中数据表或视图的个数和名称。
  • ☑返回数据表中数据字段的名称、数据类型、长度等描述信息。
  • ☑返回数据表中定义的约束、索引、主键或外键等信息。

常用的元数据函数及说明如表所示:

函数名称说明
COL_LENGTH返回列的定义长度(以字节为单位)
COL_NAME返回数据库列的名称,该列具有相应的表标识号和列标识号
DB_NAME返回数据库名
OBJECT_ID返回数据库对象标识号

6.2COL_LENGTH函数

COL_LENGTH 函数用于获取指定表中指定列的长度(以字节为单位)。它返回一个整数值,表示指定列的最大长度。

以下是 COL_LENGTH 函数的语法:

COL_LENGTH ( 'table_name' , 'column_name' )
  • table_name:要查询的表名。
  • column_name:要查询的列名。

COL_LENGTH 函数返回指定表中指定列的最大长度。

以下是一个示例,说明如何使用 COL_LENGTH 函数:

SELECT COL_LENGTH('Employees', 'EmployeeName') AS ColumnLength;

运行以上代码,将获得类似以下结果: 

表示查询了表 Employees 中的列 EmployeeName的最大长度,结果显示该列的最大长度为 100 个字节。 

注意:

COL_LENGTH 函数对于 VARCHAR 和 NVARCHAR 等可变长度的数据类型会返回列的定义长度,而对于 CHAR 和 NCHAR 等固定长度的数据类型,则返回实际占用空间的长度。

6.3COL_NAME函数

COL_NAME 函数用于获取指定表中指定列的名称。它返回一个字符串值,表示指定列的名称。

以下是 COL_NAME 函数的语法:

COL_NAME ( object_id, column_id )
  • object_id:要查询的表或视图的对象 ID。
  • column_id:要查询的列的序号。

COL_NAME 函数返回指定表中指定列的名称。

以下是一个示例,说明如何使用 COL_NAME 函数:

SELECT COL_NAME(OBJECT_ID('Employees'), 1) AS ColumnName;

 运行以上代码,将获得类似以下结果:

表示查询了表 Employees 中第一列的名称,结果显示该列的名称为 EmployeeID。 

注意:

COL_NAME 函数需要提供表或视图的对象 ID 和列的序号来准确确定列,因此需要先使用 OBJECT_ID 函数获取表或视图的对象 ID。

6.4DB_NAME函数

DB_NAME 函数用于获取当前数据库的名称。它返回一个字符串值,表示当前连接上下文中所使用的数据库的名称。

以下是 DB_NAME 函数的语法:

DB_NAME ( [database_id] )
  • database_id(可选):要查询的数据库的 ID。如果未提供此参数,则函数返回当前连接上下文中所使用的数据库的名称。

DB_NAME 函数返回当前数据库的名称。

以下是一个示例,说明如何使用 DB_NAME 函数:

SELECT DB_NAME() AS DatabaseName;

运行以上代码,将获得类似以下结果:

 

表示查询了当前连接上下文中所使用的数据库的名称,结果显示为 【MyDatabase】

注意:

DB_NAME 函数也可以接受一个可选的数据库 ID 参数,以获取指定数据库的名称。如果不提供数据库 ID 参数,则默认返回当前连接上下文中所使用的数据库的名称。

本篇内容是对SQL sever2008中常用的一些函数进行总结,通过一些示例加深理解,后续会整理一篇关于函数的创建及应用。加油干!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/104877.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ELK概述部署和Filebeat 分布式日志管理平台部署

ELK概述部署、Filebeat 分布式日志管理平台部署 一、ELK 简介二、ELK部署2.1、部署准备2.2、优化elasticsearch用户拥有的内存权限2.3、启动elasticsearch是否成功开启2.4、浏览器查看节点信息2.5、安装 Elasticsearch-head 插件2.6、ELK Logstash 部署&#xff08;在 Apache 节…

中国密码算法与NIST标准对比

1. 引言 NIST定义AES为标准的对称密钥加密算法。但NIST被指出可能在加密算法中添加NSA后门。为此&#xff0c;在中国&#xff0c;ShāngM (SM) 系列密码算法&#xff0c;作为TLS 1.3集成和无线认证的备选方案&#xff1a; SM2&#xff1a;定义了认证&#xff08;签名&#xf…

cuda卸载

去查看你的电脑显卡对应的cuda版本&#xff0c;不然还是一整个用不到gpu的情况嘿嘿. 啊啊啊啊打开控制面板看一下&#xff0c;驱动不要乱卸载&#xff1a; 这些东西不能全部卸载了哦&#xff0c;只能卸载含有“CUDA”的那几个&#xff08;其实其他的可能也没有用 但是不懂的哇 …

用Rust和cURL库做一个有趣的爬虫

以下是一个使用 Rust 和 cURL 库的下载器程序&#xff0c;用于从wechat下载音频。此程序使用了 [/get_proxy] 提供的代码。 extern crate curl;use std::io::{self, Read}; use std::process::exit; use curl::easy::Easy;fn main() {let url "https://www.wechat.com/au…

vue3 源码解析(1)— reactive 响应式实现

前言 本文是 vue3 源码解析系列的第一篇文章&#xff0c;项目代码的整体实现是参考了 v3.2.10 版本&#xff0c;项目整体架构可以参考之前我写过的文章 rollup 实现多模块打包。话不多说&#xff0c;让我们通过一个简单例子开始这个系列的文章。 举个例子 <!DOCTYPE html…

Web攻防05_MySQL_二次注入堆叠注入带外注入

文章目录 MYSQL-二次注入-74CMS思路描述&#xff1a;注入条件&#xff1a;案例&#xff1a;74CMS个人中心简历功能 MYSQL-堆叠注入-CTF强网思路描述注入条件案例&#xff1a;2019强网杯-随便注&#xff08;CTF题型&#xff09; MYSQL-带外注入-DNSLOG注入条件使用平台带外应用场…

Mybatis-Plus CRUD

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Mybatis-Plus CRUD 通用 Service CRUD 封装 IService 接口&#xff0c;进一步封装 CRUD 采用 get 查询、remove 删除 、list 查询集合、page 分页的前缀命名方式区分 …

【0229】libpq库实现压测PG服务器max_connections的最大连接数

1. PG服务器接收的最大连接数 在PG服务的postgresql.conf配置文件中,参数:max_connections 注明了PG服务所能够接受的最大客户端的连接数量。此值默认是100,那么PG服务此参数最大能够调到多大呢? 本文将采用libpq库编写demo来进行压测,并将最终的结论和数据于文章中给出。…

UWB技术在定位系统中的革新应用

超宽带技术&#xff08;Ultra-Wideband, UWB&#xff09;的崛起为定位系统领域带来了前所未有的机遇。其亚米级别的高精度定位、强大的穿透能力以及高速数据传输的特性&#xff0c;使得UWB在室内和室外定位系统中得以广泛应用。本文将深入探讨UWB技术在定位系统中的应用&#x…

关于数据可视化那些事

干巴巴的数据没人看&#xff0c;数据可视化才能直观展现数据要点&#xff0c;提升数据分析、数字化运营决策效率。那关于可视化的实现方式、技巧、工具等&#xff0c;你了解几分&#xff1f;接下来&#xff0c;我们就来聊聊数据可视化那些事。 1、什么是数据可视化&#xff1f…

java 企业工程管理系统软件源码 自主研发 工程行业适用

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

LeetCode刷题---简单组(三)

文章目录 &#x1f352;题目一 20. 有效的括号&#x1f352;解法一&#x1f352;题目二 26. 删除有序数组中的重复项&#x1f352;解法一&#x1f352;题目三 21. 合并两个有序链表&#x1f352;解法一 &#x1f352;题目一 20. 有效的括号 给定一个只包括 ‘(’&#xff0c;‘…

在antd里面渲染MarkDown并且自定义一个锚点目录TOC(重点解决导航目录不跟随文档滚动的问题)

一、整体思路 由于有很多很长的文档需要渲染&#xff0c;我觉得用MarkDown的方式会比较适合管理&#xff0c;所以这两天测试了一下在antd里面集成MarkDown的渲染模块。 总体思路参考&#xff1a; https://blog.csdn.net/Sakuraaaa_/article/details/128400497 感恩大佬的倾情付…

windows安装最新pip官方教程

在执行pip的pip install --upgrade pip更新时&#xff0c;出现如下错误&#xff0c;怎么也无法重新安装&#xff1a; 根据官网的安装教程来 命令的方式一&#xff1a; • 卸载PIP的命令&#xff1a;python -m pip uninstall pip • 重装PIP的命令&#xff1a;python -m ensure…

Biome-BGC生态系统模型与Python融合技术教程

详情点击公众号链接&#xff1a;Biome-BGC生态系统模型与Python融合技术教程 前言 Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数&#xff0c;模拟日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型…

thinkphp6项目使用多应用开发

使用composer安装项目&#xff0c;命令&#xff1a;composer create-project topthink/think thinkphp6使用多应用开发&#xff0c;安装多应用扩展&#xff0c;命令&#xff1a;composer require topthink/think-multi-app安装多应用扩展成功后&#xff0c;删除app/controller文…

如何使用 Pinia ORM 管理 Vue 中的状态

状态管理是构建任何Web应用程序的重要组成部分。虽然Vue提供了管理简单状态的技术&#xff0c;但随着应用程序复杂性的增加&#xff0c;处理状态可能变得更具挑战性。这就是为什么像Pinia这样的库被创建出来&#xff0c;以增强Vue的基本状态管理能力。然而&#xff0c;在大型应…

【虚幻引擎UE】UE4/UE5 基于2D屏幕坐标获取场景3D坐标 射线检测(蓝图/C++)

UE4/UE5 基于2D屏幕坐标获取场景3D坐标 一、射线检测1&#xff09;定义1&#xff09;射线与3D场景中的物体交互的流程2&#xff09;射线检测蓝图函数3&#xff09;蓝图实现根据鼠标点击位置获取场景中的坐标值4&#xff09;根据相机中心点获取场景中的坐标值5&#xff09;射线检…

基于SpringBoot的垃圾分类管理系统

基于SpringBootVue的垃圾分类管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven主要功能&#xff1a;包括前台和后台两部分、首页列表展示、垃圾分类、垃圾图谱、查看详…

基于PHP的图像分享社交平台

有需要请加文章底部Q哦 可远程调试 基于PHP的图像分享社交平台 一 介绍 此图像分享社交平台基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。平台角色分为用户和管理员。用户可注册登录&#xff0c;发布图像&#xff0c;修改个人信息&#xff0c;评论图像…