1、日期和时间数据类型
(1)在sqlserver 2008之前,SQL Server 支持datetime 和 smalldatetime 两种日期时间数据类型、这两种数据类型日期和时间是不可分割的、差异在日期范围、精度方面
(2)sql server 2008引入date 和 time 、datetime2、datetimeoffset数据类型、其中datetime2比date范围更大,精度更高、datetimeoffset 有一个时间偏移量组件
(3)datetime 精确到毫秒,time 和 datetime 精确到100纳秒
(4)time 、datetime2 、datetimeoffset 的存储需求取决于精度、以整数 0~7 表示秒的小数部分的精度、如TIME(0),表示小数部分为0位,精确到秒,TIME(3)表示精确到毫秒
2、日期和时间常量
(1)日期和时间常量,说白了就是日期时间类型的文本值,如orderdate = '20070212'
(2) Sql server将 文本‘20070212’ 识别为字符串常量、而不是日期和时间常量,但是由于 orderdate = '20070212' 涉及两种类型的操作数、所以必须有一个隐式转换,类型转换的方向基于数据类型的优先级、日期类型优先级高于字符串
(3)此外也可以进行显式转换
cast('20070212' as datetime)
(4)日期格式与语言有关系,如中英文日期格式不同,sql server 将日期字符串转换成日期时,基于会话的有效语言转换
(5)convert(datetime, '02/12/2007' ,101)显式转换字符串常量,第3个参数中指定一个代表所使用格式的数字、网上有编码与格式的映射表格(The Cast and Convert Functions)
3、日期筛选的优化细节
(1)使用日期函数 year 、month 是无法使用索引的
-- 以下sql 无法使用到索引 select orderid ,custid ,empid ,orderdate from Sales.Orders where year(orderdate) = 2007;
(2)应该使用以下方案替代
select orderid ,custid ,empid, orderdate from Sales.Orders where orderdate>= '20070101' and orderdate < '20080101'
4、日期与事件函数
4.1 返回当前日期和时间
(1)getdate() , 返回datetime类型、当前日期时间
(2)current_timestamp , 等价于getdate() ,返回值是datetime ,不用带括号,是标准ANSI SQL,推荐使用
(3) sysdatetime 返回的是datetime2
4.2指定格式字符串转换成日期
4.2.1 cast 、convert 、parse 、try_
(1)cast(value as datatype) 、convert(datetyepe,vulue,stylenumber)、parse( value as datatype using culture)
(2)cast convert parse 函数当源数据无法转换成日期会报错,如果加了try_前缀 函数返回null ,不会报错
(3)cast 是ANSI SQL,convert 和parse 不是,所以除非需要使用到样式编码或趋于编码,尽量使用Cast
(4) convert 和其他两个参数不一样、第一个参数是dateype ,第二步才是value,
(5)convert 既可以将字符串转时间,也可以将时间转成指定字符串
-- 字符串转时间 select convert(datetime, '02/12/2007' ,101) -- 时间转字符串,一下返回当前年月日'20190406' select convert(char(8),current_timestamp,112)
4.2.2 dateadd 函数
(1)该函数用于为指定日期部分增加一个指定的单位数量到输入的日期时间值总
(2)语法 dateadd(part, n, dt_val)
(3) part 的有效输入值有 year、 quarter 、month 、week 、day 、hour 、minute、 second 、second 等,更多的参阅SQL Server 联机丛书
-- 加一年 select dateadd(year,1,'20090212')
4.2.3 datediff函数
(1) datediff 函数返回两个日期和时间值之间在指定日期部分的差异
-- 计算一下两个日期相差多少天,返回366天 select datediff(day,'20080212','20090212')
(2)part 和前面一样
(3)是后面的日期,减去前面的日期
4.2.4 datepart函数
(1) datepart 返回一个表示所请求日期或时间值部分的整数
-- 返回2 datepart(month,'20070212')
(2) year(dt_val) 、month(dt_val) 、day(dt_val) 实际是datepart 的缩写
4.2.5 isdate函数
isdate(str) ,字符串能转换成时间返回1 ,不能返回0
4.2.6 fromparts 函数
(1)在sqlserver 2012 引入,用于接收各个部分的整数值构建对应类型
(2)格式
datefromparts(year,month,day) datetimefromparts(year,month, day, minute, seconds,millisseconds)
4.2.7 eomonth
(1)sqlserver 2012 中引入、用户接受一个日期和时间值输入,返回月末午夜日期
-- 返回当月月末日期 select eomonth(current_timestamp)
(2) 第二个参数可选,指示在原来的基础上增加多少个月
--下个月的最后一天 select eomonth(current_timestamp,1)