日期时间数据类型主要有:date,datetime,smalldatetime,datetime2,time;
date:精确到日期,如2019-01-01。
datetime:精确到毫秒(3位),如:2019-01-01 12:12:12.123。
smalldatetime:精确到分钟,秒的部分用00代替,如:2019-01-01 12:12:00
datetime2:精确到100纳秒(7位),如:2019-01-01 12:12:12.1234567
time:精确到时间,如:12:12:12.1234567
DECLARE @TIME AS TIME='12:12:12.1234567';
DECLARE @TIME2 AS TIME='12:12:12.123456789';
SELECT @TIME AS 'TIME'--结果12:12:12.1234567
SELECT @TIME2 AS 'TIME2'--结果会向四舍五入12:12:12.1234568
日期时间操作函数:SYSDATETIME,CURRENT_TIMESTAMP,GETDATE(),DATEADD,DATEDIFF,DATEPART
,YEAR,MONTH,DAY,ISDATE,DATEFROMPARTS,DATETIMEFROMPARTS,DATETIME2FROMPARTS,SMALLDATETIMEPARTS,TIMEFROMPARTS;
1.SYSTEMDATETIME() :返回datetime2类型
2.CURRENT_TIMESTAMP:返回datetime类型.标准SQL,返回类型与GETDATE()相同
3.GETDATE():返回datetime类型,非标准SQL
SELECT SYSDATETIME() AS 'SYSDATETIM',GETDATE() AS 'GETDATE',
CURRENT_TIMESTAMP AS 'CURRENT_TIMESTAMP';
--结果:
SYSDATETIM GETDATE CURRENT_TIMESTAMP
--------------------------- ----------------------- -----------------------
2019-04-28 17:09:25.6752697 2019-04-28 17:09:25.673 2019-04-28 17:09:25.673
4.DATEADD(datepart,num,date):给date指定的datepart部分加上num,返回新日期值。
DECLARE @DATE AS DATETIME2='2019-09-21 12:12:12.11111111';
SELECT DATEADD(DAY,1,@DATE) AS 'DAY',DATEADD(YEAR,1,@DATE) AS 'YEAR',DATEADD(MONTH,1,@DATE) AS 'MONTH',
DATEADD(HOUR,1,@DATE)AS 'HOUR'
结果:
DAY YEAR MONTH HOUR
--------------------------- --------------------------- --------------------------- ---------------------------
2019-09-22 12:12:12.1111111 2020-09-21 12:12:12.1111111 2019-10-21 12:12:12.1111111 2019-09-21 13:12:12.1111111
5.DATEDIFF(datepart,startdate,enddate):返回 startdate 和 enddate 之间所跨的指定 datepart 边界的计数。
DECLARE @startdate datetime2 = '2007-05-05 00:00:00.9999999';
DECLARE @enddate datetime2 = '2007-05-05 01:59:59.9999999';
SELECT DATEDIFF(day, @startdate, @enddate) AS 'DAY', DATEDIFF(HOUR, @startdate, @enddate) AS 'HOUR', DATEDIFF(MINUTE, @startdate, @enddate) AS 'MINUTE',DATEDIFF(SECOND,@startdate,@enddate) AS 'SECOND';
结果:
DAY HOUR MINUTE SECOND
----------- ----------- ----------- -----------
0 1 119 7199
6.DATEPART(datepart,date):返回date中指定的datepart部分.
7.YEAR,MONTH,DAY:返回日期相应的部分
--DATEPART函数
SELECT DATEPART(YEAR,SYSDATETIME()) AS 'YEAR',DATEPART(MONTH,SYSDATETIME()) AS 'MONTH',DATEPART(DAY,SYSDATETIME()) AS 'DAY'
--YEAR,MONTH,DAY 函数
SELECT YEAR(SYSDATETIME()) AS 'YEAR1',MONTH(SYSDATETIME()) AS 'MONTH1',DAY(SYSDATETIME()) AS 'DAY1';
--结果:
YEAR MONTH DAY
----------- ----------- -----------
2019 4 28
(1 行受影响)
YEAR1 MONTH1 DAY1
----------- ----------- -----------
2019 4 28
8.ISDATE:判断表达式是否是有效的日期类型。(注意:datetime2类型不能判断)
--datetime2
--IF ISDATE('2007-01-01 12:12:12.1234')=1 --not is date 小数点超过3位即不能判断
--datetime
--IF ISDATE('2007-01-01 12:12:12.123')=1 --IS DATE
--smalldatetime
--IF ISDATE('2007-01-01 12:12:00')=1 --IS DATE
--date
--IF ISDATE('2007-01-01')=1 --IS DATE
--time
--IF ISDATE('12:12:12.123')=1 --IS DATE
--time
IF ISDATE('12:12:12.1234')=1 --NOT IS DATE 小数点超过3位即不能判断
PRINT N'IS DATE';
ELSE
PRINT N'NOT IS DATE';
9.datefromparts,datetimefromparts,datetime2fromparts,timefromparts,smalldatetimefromparts:格式化日期生成函数。
SELECT DATEFROMPARTS(2009,01,01) AS [DATETIME];--结果:2009-01-01
SELECT TIMEFROMPARTS(22,11,11,1234567,7) AS [TIME];--7代表精度为七位,结果:22:11:11.1234567
SELECT DATETIMEFROMPARTS(2009,01,01,22,11,11,123) AS [DATETIMEFROMPARTS];--结果:2009-01-01 22:11:11.123
SELECT DATETIME2FROMPARTS(2009,01,01,22,11,11,0123456,7) AS [DATETIME2FROMPARTS];--2009-01-01 22:11:11.0123456
SELECT SMALLDATETIMEFROMPARTS(2009,01,01,22,11) AS [SMALLDATETIMEFROMPARTS];--结果:2009-01-01 22:11:00,精确到分钟