日期范围筛选
筛选日期范围时很自然的会想到 YEAR、MONTH 函数。例如筛选2017年2月创建的公司:
SELECT Name, CreateTime FROM Companies WHERE YEAR(CreateTime)=2017 AND MONTH(CreateTime)=2
但是,在筛选列上应用操作时,SQL Server 不能以有效方式使用索引,而进行全表扫描。我们应尽量避免在筛选列上执行操作,可以通过修改谓词,从而高效使用索引。
SELECT Name, CreateTime FROM Companies WHERE CreateTime>='20170201' AND CreateTime<'20180301'
日期和时间函数
当前日期和时间
SELECT [GetDate]=GETDATE(), -- DATETIME 当前日期和时间 [CurrentTimestamp]=CURRENT_TIMESTAMP, -- DATETIME 等同于GETDATE,但是遵从 ANSI SQL [GetUTCDate]=GETUTCDATE(), -- DATETIME 当前UTC日期和时间(通用协调时间) [SysDatetime]=SYSDATETIME(), -- DATETIME2 当前日期和时间 [SysUTCDatetime]=SYSUTCDATETIME(), -- DATETIME2 当前UTC日期和时间(通用协调时间) [SysDatetimeOffset]=SYSDATETIMEOFFSET() -- DATETIMEOFFSET 包含时区偏移量的当前日期时间
CURRENT_TIMESTAMP 和 GETDATE 返回相同的结果,但是前者是标准函数,建议使用前者。SQL Server 没有仅返回当前系统日期或系统时间的函数,不过可以通过 CAST 把 CURRENT_TIMESTAMP 或 SYSDATETIME 转换到 DATE 或 TIME了类型:
SELECT CurrentDate=CAST(SYSDATETIME() AS DATE), CurrentTime=CAST(SYSDATETIME() AS TIME)
CAST、CONVERT 和 PARSE 函数,以及 TRY_对应函数
CAST、CONVERT 和 PARSE 函数用于将输入值转换为目标类型,如果转换成功,则函数返回转换后的值,否则会导致查询失败。3个函数分别都有对应的称为 TRY_CAST、TRY_CONVERT、TRY_PARSE 的函数。每个前缀为 TRY_的函数接受与其对应函数相同的输入,执行相同的操作,但前缀为 TRY_的函数接受的输入如果不能转换为目标类型,函数会返回 NULL,而不是查询故障。
语法:
CAST(value AS datatype)
TRY_CAST(value AS datatype)
CONVERT(datatype,value[,style_number])
TRY_CONVERT(datatype,value[,style_number])
PARSE(value AS datetype [USING culture])
TRY_PARSE(value AS datetype [USING culture])
3个基本函数转输入的 value 到指定的目标 datatype。CONVERT 的第三个可选参数 style_number 可以指定转换的样式,可以在 SQL Server 2017文档的CAST and CONVERT(Transact-SQL)部分找到完整的样式编号列表以及它们的含义。同样,PARSE 函数也支持一个区域性说明参数,参见SQL Server 2017文档PARSE (Transact-SQL)。
当转换字符串为日期或时间数据类型时,某些字符串的格式是与语言相关的。推荐使用与语言无关的格式,或在使用 CONVERT/PARSE 函数时显示地指定样式编号或区域编号,这样无论运行的登录语言是什么,代码能够以相同的方式解释。CAST 是 ANSI,而 CONVERT 和 PARSE 不是,所以除非需要使用样式编号或区域编号,不然建议使用 CAST 函数。SELECT CAST('20180725' AS DATE) -- 2018-07-25 SELECT CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112) -- 20180725 SELECT