函数类别 

说明 

聚合函数 (Transact-SQL)

执行的操作是将多个值合并为一个值。例如 COUNT、SUM、MIN 和 MAX。

配置函数

是一种标量函数,可返回有关配置设置的信息。

加密函数 (Transact-SQL)

支持加密、解密、数字签名和数字签名验证。

游标函数

返回有关游标状态的信息。

日期和时间函数

可以更改日期和时间的值。

数学函数

执行三角、几何和其他数字运算。

元数据函数

返回数据库和数据库对象的属性信息。

排名函数

是一种非确定性函数,可以返回分区中每一行的排名值。

行集函数 (Transact-SQL)

返回可在 Transact-SQL 语句中表引用所在位置使用的行集。

安全函数

返回有关用户和角色的信息。

字符串函数

可更改 char、varchar、nchar、nvarchar、binary 和 varbinary 的值。

系统函数

对系统级的各种选项和对象进行操作或报告。

系统统计函数 (Transact-SQL)

返回有关 SQL Server 性能的信息。

文本和图像函数

可更改 text 和 image 的值。

聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。

所有聚合函数均为确定性函数。也就是说,只要使用一组特定输入值调用聚合函数,该函数总是返回相同的值。有关函数确定性的详细信息,请参阅确定性函数和不确定性函数。

聚合函数只能在以下位置作为表达式使用: 

· SELECT 语句的选择列表(子查询或外部查询)。

· COMPUTE 或 COMPUTE BY 子句。

· HAVING 子句。

Transact-SQL 提供下列聚合函数:

AVG 

MIN 

CHECKSUM 

SUM 

CHECKSUM_AGG 

STDEV 

COUNT 

STDEVP 

COUNT_BIG 

VAR 

GROUPING 

VARP 

MAX 

 

AVG

返回组中各值的平均值。空值将被忽略。

语法


AVG ( [ ALL | DISTINCT ] expression ) 

备注

如果 expression 是别名数据类型,则返回类型也具有别名数据类型。但是,如果别名数据类型的基本数据类型得到提升(例如,从 tinyint 提升到 int),则返回值具有提升的数据类型,而非别名数据类型。

参数

ALL 

对所有的值进行聚合函数运算。ALL 是默认值。

DISTINCT 

指定 AVG 只在每个值的唯一实例上执行,而不管该值出现了多少次。

expression 

是精确数值或近似数值数据类别(bit 数据类型除外)的表达式。不允许使用聚合函数和子查询。

返回类型

返回类型由 expression 的计算结果类型确定。

表达式结果 

返回类型 

integer 类别

int

decimal 类别 (p, s)

decimal(38, s) 除以 decimal(10, 0)

money 和 smallmoney 类别

money

float 和 real 类别

float

重要事项: 

使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,则 Microsoft SQL Server 2005 Database Engine 将返回错误消息并取消查询。 

示例

A. 使用 SUM 和 AVG 函数进行计算

以下示例计算 Adventure Works Cycles 的副总所用的平均休假小时数以及总的病假小时数。对检索到的所有行,每个聚合函数都生成一个单独的汇总值。

USE AdventureWorks;

GO

SELECT AVG(VacationHours)as 'Average vacation hours', 

    SUM  (SickLeaveHours) as 'Total sick leave hours'

FROM HumanResources.Employee

WHERE Title LIKE 'Vice President%';

下面是结果集: 



Average vacation hours       Total sick leave hours 

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

25                           97


(1 row(s) affected)

B. 带 GROUP BY 子句使用 SUM 和 AVG 函数

当与 GROUP BY 子句一起使用时,每个聚合函数都针对每一组生成一个值,而不是针对整个表生成一个值。以下示例针对每个销售地区生成汇总值。汇总中列出每个地区的销售人员得到的平均奖金以及每个地区的本年度销售总额。



USE AdventureWorks;

GO

SELECT TerritoryID, AVG(Bonus)as 'Average bonus', SUM(SalesYTD) 'YTD sales'

FROM Sales.SalesPerson

GROUP BY TerritoryID;

GO

下面是结果集: 


TerritoryID Average bonus     YTD sales

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

NULL        0                 0

1           4133.3333         4358526.0429

2           4100.0000         2590055.1774

3           2500.0000         1958815.8056

4           2775.0000         4023047.7121

5           6700.0000         1855106.2631

6           2750.0000         4241568.1090

7           985.0000          2177055.6488

8           75.0000           2160347.3087

9           5650.0000         2486869.8048

10          5150.0000         2568244.0549

 

(11 row(s) affected)

C. 带 DISTINCT 使用 AVG

下列语句返回产品的平均标价。


USE AdventureWorks;

GO

SELECT AVG(DISTINCT ListPrice)

FROM Production.Product;

下面是结果集: 


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

437.4042

(1 row(s) affected)

 

D. 不带 DISTINCT 使用 AVG

如果不使用 DISTINCT,AVG函数将计算出 Product表中所有产品的平均标价。



USE AdventureWorks;

GO

SELECT AVG(ListPrice)

FROM Production.Product;

下面是结果集: 



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

438.6662

(1 row(s) affected)

CHECKSUM

返回按照表的某一行或一组表达式计算出来的校验和值。CHECKSUM 用于生成哈希索引。

语法


CHECKSUM ( * | expression [ ,...n ] )

备注

CHECKSUM 对其参数列表计算一个称为校验和的哈希值。此哈希值用于生成哈希索引。如果 CHECKSUM 的参数为列,并且对计算的 CHECKSUM 值生成索引,则结果是一个哈希索引。它可用于对列进行等价搜索。

CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表的相应元素具有相同类型且相等,则在任何两个表达式列表上应用的 CHECKSUM 将返回同一值。对于该定义,指定类型的空值被作为相等进行比较。如果表达式列表中的某个值发生更改,则列表的校验和通常也会更改。但只在极少数情况下,校验和会保持不变。

表达式的顺序影响 CHECKSUM 的结果值。用于 CHECKSUM(*) 的列顺序是表或视图定义中指定的列顺序。其中包括计算列。

参数

指定对表的所有列进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。非可比数据类型为 text、ntext、image 和 cursor,也可以为将上述任一类型作为基类型的 sql_variant。

expression 

除非可比数据类型之外的任何类型的表达式。

返回类型

int

示例

下列示例显示使用 CHECKSUM 生成哈希索引。通过将计算校验和列添加到索引的表中,然后对校验和列生成索引来生成哈希索引。


-- Create a checksum index.

SET ARITHABORT ON;

USE AdventureWorks; 

GO

ALTER TABLE Production.Product

ADD cs_Pname AS CHECKSUM(Name);

GO

CREATE INDEX Pname_index ON Production.Product (cs_Pname);

GO

校验和索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。校验和索引可用于等价搜索。


/*Use the index in a SELECT query. Add a second search 

condition to catch stray cases where checksums match, 

but the values are not the same.*/

SELECT * 

FROM Production.Product

WHERE CHECKSUM(N'Bearing Ball') = cs_Pname

AND Name = N'Bearing Ball';

GO

对计算列创建索引将具体化为校验和列,对 ProductName值所做的任何更改都将传播到校验和列。也可以直接对索引的列生成索引。然而,如果键值较长,则很可能不执行校验和索引甚至常规索引。

CHECKSUM_AGG

返回组中各值的校验和。空值将被忽略。

语法

CHECKSUM_AGG ( [ ALL | DISTINCT ] expression )

备注

CHECKSUM_AGG 可用于检测表中的更改。

表中行的顺序不影响 CHECKSUM_AGG 的结果。此外,CHECKSUM_AGG 函数还可与 DISTINCT 关键字和 GROUP BY 子句一起使用。

如果表达式列表中的某个值发生更改,则列表的校验和通常也会更改。但只在极少数情况下,校验值会保持不变。

CHECKSUM_AGG 与其他聚合函数具有相似的功能。有关详细信息,请参阅聚合函数 (Transact-SQL)。

参数

ALL 

对所有的值进行聚合函数运算。ALL 为默认值。

DISTINCT 

指定 CHECKSUM_AGG 返回唯一校验值。

expression 

常量、列或函数以及数字、位运算和字符串运算符的任意组合。expression 的数据类型为 int 数据类型的表达式。不允许使用聚合函数和子查询。

有关详细信息,请参阅表达式(Transact-SQL)。

返回类型

将所有 expression 值的校验值作为 int 返回。

示例

以下示例使用 CHECKSUM_AGG检测 AdventureWorks数据库中 ProductInventory表的 Quantity列中的更改。


--Get the checksum value before the column value is changed.

USE AdventureWorks;

GO

SELECT CHECKSUM_AGG(CAST(Quantity AS int))

FROM Production.ProductInventory;

GO

下面是结果集: 


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

262


UPDATE Production.ProductInventory 

SET Quantity=125

WHERE Quantity=100;

GO

--Get the checksum of the modified column.

SELECT CHECKSUM_AGG(CAST(Quantity AS int))

FROM Production.ProductInventory;

下面是结果集: 



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

287

COUNT

返回组中的项数。COUNT 与 COUNT_BIG函数类似。两个函数唯一的差别是它们的返回值。COUNT 始终返回 int 数据类型值。COUNT_BIG 始终返回 bigint 数据类型值。

语法


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

备注

COUNT(*) 返回组中的项数。包括 NULL 值和重复项。

COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。

COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。

对于大于 2^31-1 的返回值,COUNT 生成一个错误。这时应使用 COUNT_BIG。

参数

ALL 

对所有的值进行聚合函数运算。ALL 是默认值。

DISTINCT 

指定 COUNT 返回唯一非空值的数量。

expression

除 text、image 或 ntext 以外任何类型的表达式。不允许使用聚合函数和子查询。

指定应该计算所有行以返回表中行的总数。COUNT(*) 不需要任何参数,而且不能与 DISTINCT 一起使用。COUNT(*) 不需要 expression 参数,因为根据定义,该函数不使用有关任何特定列的信息。COUNT(*) 返回指定表中行数而不删除副本。它对各行分别计数。包括包含空值的行。

重要事项: 

使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这些聚合,Microsoft SQL Server 2005 Database Engine 将返回一条错误消息并取消查询。 

返回类型

int

示例

A. 使用 COUNT 和 DISTINCT

以下示例列出了在 Adventure Works Cycles 工作的雇员可以拥有的不同标题的数量。



USE AdventureWorks;

GO

SELECT COUNT(DISTINCT Title)

FROM HumanResources.Employee;

GO

下面是结果集: 



----------- 

67


(1 row(s) affected)

B. 使用 COUNT(*)

以下示例计算 Adventure Works Cycles 的雇员总数。



USE AdventureWorks;

GO

SELECT COUNT(*)

FROM HumanResources.Employee;

GO

下面是结果集: 


            

----------- 

290

(1 row(s) affected)

C. 组合使用 COUNT(*) 和其他聚合函数

以下示例显示可以组合使用 COUNT(*)和选择列表中的其他聚合函数。


USE AdventureWorks;

GO

SELECT COUNT(*), AVG(Bonus)

FROM Sales.SalesPerson

WHERE SalesQuota > 25000;

GO

下面是结果集: 


                                 

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

14            3472.1428

(1 row(s) affected)

COUNT_BIG

返回组中的项数。COUNT_BIG 的用法与 COUNT 函数类似。两个函数唯一的差别是它们的返回值。COUNT_BIG 始终返回 bigint 数据类型值。COUNT 始终返回 int 数据类型值。

语法

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

备注

COUNT_BIG(*) 返回组中的项数。包括 NULL 值和重复项。

COUNT_BIG(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。

COUNT_BIG(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。

参数

ALL 

对所有的值进行聚合函数运算。ALL 是默认值。

DISTINCT 

指定 COUNT_BIG 返回唯一非空值的数量。 

expression 

是任何类型的表达式。不允许使用聚合函数和子查询。

指定应该计算所有行以返回表中行的总数。COUNT_BIG(*) 不需要任何参数,而且不能与 DISTINCT 一起使用。COUNT(*) 不需要 expression 参数,因为根据定义,该函数不使用有关任何特定列的信息。COUNT_BIG(*) 返回指定表中的行数并将重复行计算在内。它对各行分别计数。包括包含空值的行。

返回类型

bigint

GROUPING

聚合函数;当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。 

仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相关联的选择列表中才允许分组。

语法


GROUPING ( column_name ) <OVER Clause

备注

分组用于区分由标准空值产生的 CUBE 和 ROLLUP 所返回的空值。作为 CUBE 或 ROLLUP 操作结果返回的 NULL 是 NULL 的特殊应用。它在结果集内作为列的占位符,表示全体。

参数

column_name 

GROUP BY 子句中的列,用于测试 CUBE 或 ROLLUP 空值。

<Over_Clause>

将 FROM 子句产生的结果集划分成应用了 Ranking Window 或 Aggregate Window 函数的分区或窗口。

返回类型

int

示例

以下示例将分组 SalesQuota并聚合 SaleYTD数量。GROUPING函数应用于 SalesQuota列。


USE AdventureWorks;

GO

SELECT SalesQuota, SUM(SalesYTD) 'TotalSalesYTD', GROUPING(SalesQuota) AS 'Grouping'

FROM Sales.SalesPerson

GROUP BY SalesQuota WITH ROLLUP;

GO

结果集在 SalesQuota下面显示两个空值。第一个 NULL代表从表中的这一列得到的空值组。第二个 NULL位于 ROLLUP 操作所添加的汇总行之中。汇总行显示所有 SalesQuota组的 TotalSalesYTD数量,并以 Grouping列中的 1进行指示。

下面是结果集: 


SalesQuota     TotalSalesYTD        Grouping 

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

NULL           1533087.5999          0

250000.00      33461260.59           0

300000.00      9299677.9445          0

NULL           44294026.1344         1

(4 row(s) affected)

MAX

返回表达式的最大值。

语法

MAX ( [ ALL | DISTINCT ] expression )  

备注

MAX 忽略任何空值。

对于字符列,MAX 查找按排序序列排列的最大值。

参数

ALL 

对所有的值应用此聚合函数。ALL 是默认值。

DISTINCT 

指定考虑每个唯一值。DISTINCT 对于 MAX 无意义,使用它仅仅是为了符合 SQL-92。

expression

常量、列名、函数以及算术运算符、位运算符和字符串运算符的任意组合。MAX 可用于数字列、字符列和 datetime 列,但不能用于 bit 列。不允许使用聚合函数和子查询。

有关详细信息,请参阅表达式(Transact-SQL)。

返回类型

返回与 expression 相同的值。

重要事项: 

当使用 CUBE 或 ROLLUP 时,不支持非重复聚合,例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,Microsoft SQL Server 2005 Database Engine 将返回错误消息并取消查询。 

示例

以下示例返回最高(最大)税率。


USE AdventureWorks;

GO

SELECT MAX(TaxRate)

FROM Sales.SalesTaxRate;

GO

下面是结果集: 


------

19.60

(1 row(s) affected)

Warning, null value eliminated from aggregate.

MIN

返回表达式中的最小值。

语法

MIN ( [ ALL | DISTINCT ] expression ) 

备注

MIN 忽略任何空值。

对于字符数据列,MIN 查找排序序列的最低值。

参数

ALL 

对所有的值进行聚合函数运算。ALL 是默认值。

DISTINCT 

指定每个唯一值都被考虑。DISTINCT 对于 MIN 无意义,使用它仅仅是为了符合 SQL-92。

expression

常量、列名、函数以及算术运算符、位运算符和字符串运算符的任意组合。MIN 可以用于数字列、char 列、varchar 列或 datetime 列,但不能用于 bit 列。不允许使用聚合函数和子查询。

有关详细信息,请参阅表达式(Transact-SQL)。

返回类型

返回与 expression 相同的值。

重要事项: 

使用 CUBE 或 ROLLUP 时,不支持非重复聚合,例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,则 Microsoft SQL Server 2005 Database Engine 将返回错误消息并结束查询。 

示例

以下示例返回最低(最小)税率。


USE AdventureWorks;

GO

SELECT MIN(TaxRate)

FROM Sales.SalesTaxRate;

GO

下面是结果集: 


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

5.00

(1 row(s) affected)

SUM

返回表达式中所有值的和或仅非重复值的和。SUM 只能用于数字列。空值将被忽略。

语法

SUM ( [ ALL | DISTINCT ] expression )

参数

ALL 

对所有的值应用此聚合函数。ALL 是默认值。

DISTINCT 

指定 SUM 返回唯一值的和。

expression

常量、列或函数与算术、位和字符串运算符的任意组合。expression 是精确数字或近似数字数据类型类别(bit 数据类型除外)的表达式。不允许使用聚合函数和子查询。有关详细信息,请参阅表达式(Transact-SQL)。

返回类型

以最精确的 expression 数据类型返回所有 expression 值的和。

表达式结果 

返回类型 

整数类别

int

decimal 类别 (p, s)

decimal(38, s)

money 和 smallmoney 类别

money

float 和 real 类别

float

重要事项: 

当使用 CUBE 或 ROLLUP 时,不支持非重复聚合,例如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,SQL Server 2005 Database Engine 将返回错误消息并取消查询。 

示例

A. 在聚合和行聚合中使用 SUM

以下示例显示了聚合函数与行聚合函数之间的区别。第一个示例显示了只提供汇总数据的聚合函数,第二个示例显示了提供详尽数据和汇总数据的行聚合函数。


USE AdventureWorks;

GO

SELECT Color, SUM(ListPrice), SUM(StandardCost)

FROM Production.Product

WHERE Color IS NOT NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%'

GROUP BY Color

ORDER BY Color;

GO

下面是结果集: 


Color                                 

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

Black           27404.84              15214.9616

Silver          26462.84              14665.6792

White           19.00                 6.7926

(3 row(s) affected)

USE AdventureWorks;

GO

SELECT Color, ListPrice, StandardCost

FROM Production.Product

WHERE Color IS NOT NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%'

ORDER BY Color

COMPUTE SUM(ListPrice), SUM(StandardCost) BY Color;

GO

下面是结果集: 


Color           ListPrice             StandardCost

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

Black           2294.99               1251.9813

Black           2294.99               1251.9813

Black           2294.99               1251.9813

Black           1079.99               598.4354

Black           1079.99               598.4354

Black           1079.99               598.4354

Black           1079.99               598.4354

Black           3374.99               1898.0944

Black           3374.99               1898.0944

Black           3374.99               1898.0944

Black           3374.99               1898.0944

Black           539.99                294.5797

Black           539.99                294.5797

Black           539.99                294.5797

Black           539.99                294.5797

Black           539.99                294.5797

sum                   sum

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

27404.84              15214.9616

Color           ListPrice             StandardCost

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

Silver          2319.99               1265.6195

Silver          2319.99               1265.6195

Silver          2319.99               1265.6195

Silver          3399.99               1912.1544

Silver          3399.99               1912.1544

Silver          3399.99               1912.1544

Silver          3399.99               1912.1544

Silver          769.49                419.7784

Silver          769.49                419.7784

Silver          769.49                419.7784

Silver          769.49                419.7784

Silver          564.99                308.2179

Silver          564.99                308.2179

Silver          564.99                308.2179

Silver          564.99                308.2179

Silver          564.99                308.2179

sum                   sum

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

26462.84              14665.6792

Color           ListPrice             StandardCost

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

White           9.50                  3.3963

White           9.50                  3.3963

sum                   sum

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

19.00                 6.7926

(37 row(s) affected)

B. 计算多列的组合计

以下示例针对 Product表中列出的每种颜色计算 ListPrice与 StandardCost的和。


USE AdventureWorks;

GO

SELECT Color, SUM(ListPrice), SUM(StandardCost)

FROM Production.Product

GROUP BY Color

ORDER BY Color

GO

下面是结果集: 


Color                                 

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

NULL            4182.32               2238.4755

Black           67436.26              38636.5002

Blue            24015.66              14746.1464

Grey            125.00                51.5625

Multi           478.92                272.2542

Red             53274.10              32610.7661

Silver          36563.13              20060.0483

Silver/Black    448.13                198.97

White           36.98                 13.5172

Yellow          34527.29              21507.6521

(10 row(s) affected)

STDEV

返回指定表达式中所有值的标准偏差。

语法

STDEV ( [ ALL | DISTINCT ] expression ) 

备注

如果在 SELECT 语句中的所有项目上使用 STDEV,则计算中包括结果集内的每个值。STDEV 只能用于数字列。将忽略空值。

参数

ALL 

对所有值应用该函数。ALL 是默认值。

DISTINCT 

指定每个唯一值都被考虑。 

expression 

是一个数值表达式。不允许聚合函数和子查询。expression 是精确数字或近似数字数据类型类别(bit 数据类型除外)的表达式。

返回类型

float

示例

以下示列返回 SalesPerson表中的所有奖金值的标准偏差。


USE AdventureWorks;

GO

SELECT STDEV(Bonus)

FROM Sales.SalesPerson;

GO

STDEVP

返回指定表达式中所有值的总体标准偏差。

语法

STDEVP ( [ ALL | DISTINCT ] expression ) 

备注

如果在 SELECT 语句中的所有项目上都使用 STDEVP,则计算中包括结果集内的每个值。STDEVP 只能用于数字列。空值将被忽略。

参数

ALL 

对所有值应用该函数。ALL 是默认值。

DISTINCT 

指定每个唯一值都被考虑。 

expression

一个数值表达式。不允许聚合函数和子查询。expression 是精确数字或近似数字数据类型类别(bit 数据类型除外)的表达式。

expression 

一个数值表达式。不允许聚合函数和子查询。expression 是精确数字或近似数字数据类型类别(bit 数据类型除外)的表达式。

返回类型

float

示例

以下示例返回 SalesPerson表中所有奖金值的总体标准偏差。


USE AdventureWorks;

GO

SELECT STDEVP(Bonus)

FROM Sales.SalesPerson;

GO

VAR

返回指定表达式中所有值的方差。

语法

VAR ( [ ALL | DISTINCT ] expression ) 

备注

如果 VAR 用于 SELECT 语句中的所有项目,则结果集中的每个值都包含在计算中。VAR 只可用于数字列。空值将被忽略。

参数

ALL 

对所有值应用该函数。ALL 是默认值。

DISTINCT 

指定每个唯一值都被考虑。 

expression 

精确数字或近似数字数据类型类别(bit 数据类型除外)的表达式。不允许使用聚合函数和子查询。

返回类型

float

示例

以下示例返回 SalesPerson表中所有奖金值的方差。


USE AdventureWorks;

GO

SELECT VAR(Bonus)

FROM Sales.SalesPerson;

GO

VARP

返回指定表达式中所有值的总体方差。

语法

VARP ( [ ALL | DISTINCT ] expression ) 

备注

如果对 SELECT 语句中的所有项目使用 VARP,则在计算中将包括结果集中的每个值。VARP 可只用于数字列。空值将被忽略。

参数

ALL 

对所有值应用该函数。ALL 是默认值。

DISTINCT 

指定考虑每一个唯一值。 

expression

是精确数字或近似数字数据类型类别(bit 数据类型除外)的表达式。不允许使用聚合函数和子查询。

返回类型

float

示例

以下示例将返回 SalesPerson表中所有 bonus 值的总体方差。


USE AdventureWorks;

GO

SELECT VARP(Bonus)

FROM Sales.SalesPerson;

GO

日期和时间函数

以下标量函数对日期和时间输入值执行操作,并返回一个字符串、数字值或日期和时间值。

函数 

确定性 

DATEADD 

具有确定性

DATEDIFF 

具有确定性

DATENAME 

不具有确定性

DATEPART 

除了用作 DATEPART (dw, date) 外都具有确定性。dw 是 weekday 的日期部分,取决于设置每周的第一天的 SET DATEFIRST 所设置的值。

DAY 

具有确定性

GETDATE 

不具有确定性

GETUTCDATE 

不具有确定性

MONTH 

具有确定性

YEAR 

具有确定性

DATEADD

返回给指定日期加上一个时间间隔后的新 datetime 值。

语法

DATEADD (datepart , number, date )

参数

datepart

指定要返回新值的日期的组成部分。下表列出了 Microsoft SQL Server 2005 可识别的日期部分及其缩写。

日期部分 

缩写 

year

yy, yyyy

quarter

qq, q

month

mm, m

dayofyear

dy, y

day

dd, d

week

wk, ww

weekday

dw, w

hour

hh

minute

mi, n

second

ss, s

millisecond

ms

number

用于与 datepart 相加的值。如果指定了非整数值,则将舍弃该值的小数部分。例如,如果为 datepart 指定 day,为 number 指定 1.75,则 date 将增加 1。

date

表达式,用于返回 datetime 或 smalldatetime 值,或日期格式的字符串。有关指定日期的详细信息,请参阅 日期和时间 (Transact-SQL)。

如果只指定年份的后两位数字,则小于或等于 two digit year cutoff 配置选项值的后两位数字的值将与截止年份处于同一世纪中。比此选项值的后两位数字大的值先于截止年份的世纪。例如,如果 two-digit year cutoff 为 2049(默认值),则 49 被解释为 2049,而 2050 被解释为 1950。为避免歧义,请使用四位的年份。 

返回类型

返回 datetime。但是,如果 date 参数为 smalldatetime,则返回 smalldatetime。

示例

以下示例将输出 AdventureWorks数据库中订单的时间范围的列表。此时间范围为当前订单日期加上 21天。


USE AdventureWorks;

GO

SELECT DATEADD(day, 21, OrderDate)AS TimeFrame 

FROM Sales.SalesOrderHeader;

GO

DATEDIFF

返回跨两个指定日期的日期边界数和时间边界数。

语法

DATEDIFF ( datepart , startdate , enddate )

备注

enddate 减去 startdate。如果 startdate 晚于 enddate,则返回负值。

如果结果超出整数值范围,则 DATEDIFF 将产生错误。对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。

跨分钟、秒和毫秒等边界计算的方法使得 DATEDIFF 指定的结果在所有数据类型中均一致。结果是带正负号的整数值,它等于跨第一个和第二个日期间的 datepart 边界数。例如,在 1 月 4 日(星期日)和 1 月 11 日(星期日)之间的星期数是 1。

参数

datepart 

指定应在日期的哪一部分计算差额的参数。下表列出了 Microsoft SQL Server 2005 可识别的日期部分及其缩写。

日期部分 

缩写 

year

yy, yyyy

quarter

qq, q

month

mm, m

dayofyear

dy, y

day

dd, d

week

wk, ww

Hour

hh

minute

mi, n

second

ss, s

millisecond

ms

startdate -

计算的开始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

由于 smalldatetime 只精确到分钟,所以在使用 smalldatetime 值时,秒和毫秒始终为 0。 

如果只指定年份的后两位数字,则小于或等于 two-digit year cutoff 配置选项值的后两位数字的值将与截止年份处于同一世纪中。比此选项值的后两位数字大的值先于截止年份的世纪。例如,如果 two-digit year cutoff 为 2049(默认值),则 49 被解释为 2049,2050 被解释为 1950。为避免含糊歧义,请使用四位数表示的年份。 

有关指定时间值的详细信息,请参阅时间格式。有关指定日期的详细信息,请参阅 日期和时间 (Transact-SQL)。 

enddate 

计算的结束日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

返回类型

integer

示例

以下示例确定在 AdventureWorks数据库中产品的订单日期和当前日期相差的天数。


USE AdventureWorks;

GO

SELECT DATEDIFF(day, OrderDate, GETDATE()) AS NumberOfDays

FROM Sales.SalesOrderHeader;

GO

DATENAME

返回表示指定日期的指定日期部分的字符串。

重要事项: 

此功能与早期版本的 SQL Server 有所不同。有关详细信息,请参阅 SQL Server 2005 中数据库引擎功能的行为更改。 

语法

DATENAME ( datepart ,date )

备注

SQL Server 2005 Database Engine 自动在字符和 datetime 值间按需要进行转换,例如,当将字符值与 datetime 值进行比较时。

参数

datepart 

是指定要返回的日期部分的参数。下表列出了 Microsoft SQL Server 2005 可识别的日期部分及其缩写。

日期部分 

缩写 

year

yy, yyyy

quarter

qq, q

month

mm, m

dayofyear

dy, y

day

dd, d

week

wk, ww

weekday

dw

hour

hh

minute

mi, n

second

ss, s

millisecond

ms

weekday (dw) 日期部分返回星期几(如星期日、星期一等)。 

date 

表达式,用于返回 datetime 或 smalldatetime 值,或日期格式的字符串。对 1753 年 1 月 1 日以后的日期使用 datetime 数据类型。对于更早的日期存储为字符数据。当输入 datetime 值时,始终将其放入引号中。由于 smalldatetime 只精确到分钟,因此当使用 smalldatetime 值时,秒和毫秒始终为 0。有关指定日期的详细信息,请参阅日期和时间 (Transact-SQL)。有关指定时间值的详细信息,请参阅时间格式。

如果只指定年份的后两位数字,则小于或等于 two-digit year cutoff 配置选项值的后两位数字的值将与截止年份处于同一世纪中。比此选项值的后两位数字大的值先于截止年份的世纪。例如,如果 two-digit year cutoff 为 2049(默认值),则 49 被解释为 2049,50 被解释为 1950。为避免多义性,请使用四位年份。 

返回类型

nvarchar

示例

以下示例从 GETDATE返回的日期中提取月份名。


SELECT DATENAME(month, GETDATE()) AS 'Month Name'

下面是结果集: 


Month Name                     

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

February          

DATEPART

返回表示指定日期的指定日期部分的整数。

语法

DATEPART ( datepart , date )

备注

DAY、MONTH、和 YEAR 函数分别是 DATEPART(dd, date)、DATEPART(mm, date) 和 DATEPART(yy, date) 的同义词。

参数

datepart

指定要返回的日期部分的参数。下表列出了 Microsoft SQL Server 2005 可识别的日期部分及其缩写。

日期部分 

缩写 

year

yy, yyyy

quarter

qq, q

month

mm, m

dayofyear

dy, y

day

dd, d

week

wk, ww

weekday

dw

hour

hh

minute

mi, n

second

ss, s

millisecond

ms

week (wk, ww) 日期部分反映对 SET DATEFIRST 所做的更改。任意一年的 1 月 1 日均定义 week 日期部分的开头数字,例如: DATEPART(wk, 'Jan 1, xxxx') = 1,其中,xxxx 是任意一年。 

weekday (dw) 日期部分返回与一周的某一天对应的数字,例如:Sunday = 1, Saturday = 7。weekday 日期部分生成的数字取决于 SET DATEFIRST 所设置的值。这设置一周中的第一天。 

date 

表达式,用于返回 datetime 或 smalldatetime 值,或日期格式的字符串。仅对 1753 年 1 月 1 日之后的日期使用 datetime 数据类型。将之前的日期存储为字符数据。当输入 datetime 值时,应始终将其放入引号中。由于 smalldatetime 只精确到分钟,所以在使用 smalldatetime 值时,秒和毫秒始终为 0。

如果只指定年份的后两位数字,则小于或等于 two-digit year cutoff 配置选项值的后两位数字的值将与截止年份处于同一世纪中。比此选项值的后两位数字大的值先于截止年份的世纪。例如,如果 two-digit year cutoff 是 2049(默认值),则 49 将被解释为 2049,而 50 则将被解释为 1950。为了避免产生歧义,请使用四位年份。 

有关指定时间值的详细信息,请参阅时间格式。有关指定日期的详细信息,请参阅 日期和时间 (Transact-SQL)。 

返回类型

int

示例

GETDATE 函数返回当前日期。但是,进行比较时并不总是需要提供完整日期;通常,只对日期的一部分进行比较。以下示例显示 GETDATE和 DATEPART的输出。



SELECT GETDATE() AS 'Current Date'        
GO

下面是结果集: 



Current Date                        
---------------------------         
Feb 18 1998 11:46PM                 

SELECT DATEPART(month, GETDATE()) AS 'Month Number'        
GO

下面是结果集: 



Month Number 

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

2            

以下示例假设日期为 5 月 29 日。



SELECT DATEPART(month, GETDATE())

GO

下面是结果集: 



----------- 

5           

(1 row(s) affected)

在下面的示例中,日期被指定为数字。请注意,SQL Server 将 0 解释为 1900 年 1 月 1 日。



SELECT DATEPART(m, 0), DATEPART(d, 0), DATEPART(yy, 0)

下面是结果集: 



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

1     1      1900

DAY

返回一个整数,表示指定日期的天 datepart 部分。

语法


DAY ( date )

备注

此函数等价于 DATEPART(dd, date)。

参数

date

datetime 或 smalldatetime 类型的表达式。

返回类型

int

示例

以下示例返回日期 03/12/1998中的天的数字。



SELECT DAY('03/12/1998') AS 'Day Number';        
GO

下面是结果集: 



Day Number 

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

12            

在下面的示例中,日期被指定为数字。Microsoft SQL Server 2005 Database Engine 将 0解释为 1900 年 1 月 1 日。 



SELECT MONTH(0), DAY(0), YEAR(0)

下面是结果集: 



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

1     1      1900

GETDATE

以 datetime 值的 SQL Server 2005 标准内部格式返回当前系统日期和时间。

语法


GETDATE ( )

备注

GETUTCDATE 是非确定性函数。引用该列的视图和表达式无法进行索引。

在查询中,日期函数可用于 SELECT 语句的选择列表或 WHERE 子句。

在设计报表时,GETDATE 函数可用于在每次生成报表时打印当前日期和时间。GETDATE 对于跟踪活动也很有用,诸如记录事务在某一帐户上发生的时间。

返回类型

datetime

示例

A. 使用 GET DATE 返回当前日期和时间

以下示例查找当前系统日期和时间。



SELECT GETDATE();        
GO

下面是结果集: 



-------------------------        
July 29 1998   2:50    PM        

(1 row(s) affected)

B. 在 CREATE TABLE 中使用 GETDATE

以下示例创建 employees表并使用 GETDATE作为 emp_hire_date的默认值。



USE AdventureWorks;        
GO        
CREATE TABLE employees        
(        
 emp_id char(11) NOT NULL,        
 emp_lname varchar(40) NOT NULL,        
 emp_fname varchar(20) NOT NULL,        
 emp_hire_date datetime DEFAULT GETDATE(),        
 emp_mgr varchar(30)        
);        
GO

GETUTCDATE

返回表示当前的 UTC 时间(通用协调时间或格林尼治标准时间)的 datetime 值。当前的 UTC 时间得自当前的本地时间和运行 Microsoft SQL Server 实例的计算机操作系统中的时区设置。 

语法


GETUTCDATE()

备注

GETUTCDATE 是非确定性函数。引用该列的视图和表达式无法进行索引。

GETUTCDATE 无法在用户定义函数内调用。

返回类型

Datetime

GETUTCDATE

返回表示当前的 UTC 时间(通用协调时间或格林尼治标准时间)的 datetime 值。当前的 UTC 时间得自当前的本地时间和运行 Microsoft SQL Server 实例的计算机操作系统中的时区设置。 

语法


GETUTCDATE()

备注

GETUTCDATE 是非确定性函数。引用该列的视图和表达式无法进行索引。

GETUTCDATE 无法在用户定义函数内调用。

返回类型

Datetime

MONTH

返回表示指定日期的“月”部分的整数。

语法


MONTH ( date )

备注

MONTH 等价于 DATEPART(mm, date)。

请始终将 datetime 值包含在引号中。对于早期日期,可将日期存储为字符数据。

Microsoft SQL Server 2005 Database Engine 可识别各种日期格式。有关日期和时间数据的详细信息,请参阅 CAST 和 CONVERT (Transact-SQL)。

参数

date

表达式,用于返回 datetime 或 smalldatetime 值,或日期格式的字符串。仅对 1753 年 1 月 1 日后的日期使用 datetime 数据类型。

返回类型

int

示例

以下示例返回日期 03/12/1998中的月份。

SELECT "Month Number" = MONTH('03/12/1998')        
GO

下面是结果集: 

Month Number 

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

3            

下面的示例将日期指定为数字。数据库引擎 将 0解释为 1900 年 1 月 1 日。

SELECT MONTH(0), DAY(0), YEAR(0)

下面是结果集: 

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

1     1      1900

YEAR

返回表示指定日期的年份的整数。

语法

YEAR ( date )

备注

此函数等价于 DATEPART(yy, date)。

参数

date

datetime 或 smalldatetime 类型的表达式。

返回类型

int

示例

以下示例从日期 03/12/1998中返回年份数。

SELECT "Year Number" = YEAR('03/12/1998')        
GO

下面是结果集: 

Year Number         
------------         
1998

以下示例将日期指定为数字。Microsoft SQL Server 2005 Database Engine 将 MONTH(0)解释为 1,将 (January), DAY(0)解释为 1,将 YEAR(0)解释为 1900。



SELECT MONTH(0), DAY(0), YEAR(0)

下面是结果集: 

----- ------ ------        
1     1      1900