T-SQL 日期处理总结
明天放假,今天刚好整理一下,对于日期的格式、推算、运算是平时常用的,简单易错。
1. T-SQL 日期格式转换
由原始的值2012-04-03 10:57:06.127转换成以下20种常用的格式
2012-04-03
20120403
2012.04.03
04/03/2012
03/04/2012
03.04.2012
03-04-2012
03 Apr 2012
Apr 03, 2012
10:57:06
Apr 3 2012
04-03-2012
2012/04/03
20120403
03 Apr 2012
10:57:06:127
2012-4-3
2012年04月03日
2012年4月3日
2012-04-03 10:57:06:127
代码:
1: --由2012-04-03 10:23:10.177转换成2012-04-03
2: SELECT GETDATE() AS Val,Convert(char(11),GETDATE(),120) AS NeedVal
3:
4: --由2012-04-03 10:23:10.177转换成20120403
5: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 112 ) AS NeedVal
6:
7: --由2012-04-03 10:23:10.177转换成2012.04.03
8: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 102 ) AS NeedVal
9:
10: --由2012-04-03 10:23:10.177转换成04/03/2012 月日年
11: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 101 ) AS NeedVal
12:
13: --由2012-04-03 10:23:10.177转换成03/04/2012 日月年
14: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 103 ) AS NeedVal
15:
16: --由2012-04-03 10:23:10.177转换成03.04.2012 日月年
17: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 104 ) AS NeedVal
18:
19: --由2012-04-03 10:23:10.177转换成03-04-2012 日月年
20: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 105 ) AS NeedVal
21:
22: --由2012-04-03 10:23:10.177转换成03 Apr 2012 日月年
23: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 106 ) AS NeedVal
24:
25: --由2012-04-03 10:23:10.177转换成Apr 03, 2012
26: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 107 ) AS NeedVal
27:
28: --由2012-04-03 10:23:10.177转换成10:44:02
29: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 108 ) AS NeedVal
30:
31: --由2012-04-03 10:23:10.177转换成Apr 3 2012
32: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 109 ) AS NeedVal
33:
34: --由2012-04-03 10:23:10.177转换成04-03-2012
35: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 110 ) AS NeedVal
36:
37: --由2012-04-03 10:23:10.177转换成2012/04/03
38: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 111 ) AS NeedVal
39:
40: --由2012-04-03 10:23:10.177转换成20120403
41: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 112 ) AS NeedVal
42:
43: --由2012-04-03 10:23:10.177转换成03 Apr 2012
44: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 113 ) AS NeedVal
45:
46: --由2012-04-03 10:23:10.177转换成10:45:45:447
47: select GETDATE() AS Val,CONVERT(varchar(12) , getdate(), 114 ) AS NeedVal
48:
49: --由2012-04-03 10:23:10.177转换成2012-4-3
50: SELECT GETDATE() AS Val,REPLACE(CONVERT(varchar(10),GETDATE(),120),N'-0','-') AS NeedVal
51:
52: --由2012-04-03 10:23:10.177转换成2012年04月03日
53: SELECT GETDATE() AS Val,STUFF(STUFF(CONVERT(char(8),GETDATE(),112),5,0,N'年'),8,0,N'月')+N'日' AS NeedVal
54:
55: --由2012-04-03 10:23:10.177转换成2012年4月3日
56: SELECT GETDATE() AS Val,DATENAME(Year,GETDATE())+N'年'+CAST(DATEPART(Month,GETDATE()) AS varchar)+N'月'+DATENAME(Day,GETDATE())+N'日' AS NeedVal
57:
58: --由2012-04-03 10:23:10.177转换成2012-04-03 10:23:10.177
59: SELECT GETDATE() AS Val,CONVERT(char(11),GETDATE(),120)+CONVERT(char(12),GETDATE(),114) AS NeedVal
2. T-SQL 日期推算
给定日期,得到该年的第一天和最后一天
给定日期所在季度的第一天和最后一天
给定日期所在月份的第一天或最后一天
给定日期所在周的取星期几的日期,星期天做为一周的第1天
昨天
前天
明天
后天
上一年
下一年
上季度
下季度
上月
下月
上周
下周
前一小时
后一小时
前一分钟
后一分钟
前一秒
后一秒
代码:
1: --给定日期,得到该年的第一天和最后一天
2: SELECT CONVERT(char(5),GETDATE(),120)+'1-1' AS FDATE,CONVERT(char(5),GETDATE(),120)+'12-31' LDTAE
3:
4: --给定日期所在季度的第一天和最后一天,两种方法算最后一天
5: SELECT CONVERT(datetime,CONVERT(char(8),DATEADD(Month,DATEPART(Quarter,GETDATE())*3-Month(GETDATE())-2,GETDATE()),120)+'1') AS FDATE
6: ,CONVERT(datetime,CONVERT(char(8),DATEADD(Month,DATEPART(Quarter,GETDATE())*3-Month(GETDATE()),GETDATE()),120)
7: +CASE WHEN DATEPART(Quarter,GETDATE()) in(1,4)
8: THEN '31'ELSE '30' END) AS LDATE
9:
10:
11: SELECT CONVERT(datetime,CONVERT(char(8),DATEADD(Month,DATEPART(Quarter,GETDATE())*3-Month(GETDATE())-2,GETDATE()),120)+'1') AS FDATE
12: ,DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1+DATEPART(Quarter,GETDATE())*3-Month(GETDATE()),GETDATE()),120)+'1') AS LDATE
13:
14: --给定日期所在月份的第一天和最后一天
15: SELECT CONVERT(datetime,CONVERT(char(8),GETDATE(),120)+'1') AS FDATE,DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,GETDATE()),120)+'1') AS LDATE
16:
17: --给定日期所在周的取星期几的日期,星期天做为一周的第1天
18: SELECT DATEADD(Day,0-(DATEPART(Weekday,GETDATE())+@@DATEFIRST-1)%7,GETDATE())
19: SELECT DATEADD(Day,1-(DATEPART(Weekday,GETDATE())+@@DATEFIRST-1)%7,GETDATE())
20: SELECT DATEADD(Day,2-(DATEPART(Weekday,GETDATE())+@@DATEFIRST-1)%7,GETDATE())
21: SELECT DATEADD(Day,3-(DATEPART(Weekday,GETDATE())+@@DATEFIRST-1)%7,GETDATE())
22: SELECT DATEADD(Day,4-(DATEPART(Weekday,GETDATE())+@@DATEFIRST-1)%7,GETDATE())
23: SELECT DATEADD(Day,5-(DATEPART(Weekday,GETDATE())+@@DATEFIRST-1)%7,GETDATE())
24: SELECT DATEADD(Day,6-(DATEPART(Weekday,GETDATE())+@@DATEFIRST-1)%7,GETDATE())
25:
26: --昨天
27: SELECT DATEADD(Day,-1,GETDATE())
28: --前天
29: SELECT DATEADD(Day,-2,GETDATE())
30: --明天
31: SELECT DATEADD(Day,1,GETDATE())
32: --后天
33: SELECT DATEADD(Day,2,GETDATE())
34:
35: --上一年
36: SELECT DATEADD(year,-1,GETDATE())
37:
38: --下一年
39: SELECT DATEADD(year,1,GETDATE())
40:
41: --上季度
42: SELECT DATEADD(quarter,-1,GETDATE())
43:
44: --下季度
45: SELECT DATEADD(quarter,1,GETDATE())
46:
47: --上月
48: SELECT DATEADD(month,-1,GETDATE())
49:
50: --下月
51: SELECT DATEADD(month,1,GETDATE())
52:
53: --上周
54: SELECT DATEADD(week,-1,GETDATE())
55:
56: --下周
57: SELECT DATEADD(week,1,GETDATE())
58:
59: --前一小时
60: SELECT DATEADD(hour ,-1,GETDATE())
61:
62: --后一小时
63: SELECT DATEADD(hour ,1,GETDATE())
64:
65: --前一分钟
66: SELECT DATEADD(minute,-1,GETDATE())
67:
68: --后一分钟
69: SELECT DATEADD(minute,1,GETDATE())
70:
71: --前一秒
72: SELECT DATEADD(second ,-1,GETDATE())
73:
74: --后一秒
75: SELECT DATEADD(second ,1,GETDATE())
3. T-SQL日期运算
SELECT DATEDIFF(year, '2012-04-03', '2013-04-03'); --两日期差异年的运算
SELECT DATEDIFF(quarter, '2012-04-03', '2013-04-03'); --两日期差异季度的运算
SELECT DATEDIFF(day, '2012-04-03', '2013-04-03'); --两日期差异日的运算
SELECT DATEDIFF(week, '2012-04-03', '2013-04-03'); --两日期差异周的运算
SELECT DATEDIFF(hour, '2012-04-03', '2013-04-03'); --两日期差异小时的运算
SELECT DATEDIFF(minute, '2012-04-03', '2013-04-03'); --两日期差异分钟的运算
SELECT DATEDIFF(second, '2012-04-03', '2013-04-03'); --两日期差异秒的运算