存儲大小為:8個字節;
日期范圍:1753-01-01到9999-12-31;
精確度:3.33毫秒;
常用的日期函數GetDate()獲取系統當前日期select GETDATE()DatePart(part,dtValue) 獲取日期中的一部分,part為要獲取的部分,dtValue為日期
part 參數有:
日期部分 縮寫year yy, yyyyquarter QQ, qmonth mm, mdayofyear dy, yday dd, dweek wk, wwweekday dwHour hhminute mi, nsecond ss, smillisecond ms
select GETDATE() as '系統當前日期' , DATEPART(YEAR, GETDATE()) as '年', DATEPART(month,GETDATE()) as '月', DATEPART(DAY,GETDATE()) as '天', DATEPART(HOUR,GETDATE()) as '小時', DATEPART(minute,GETDATE()) as '分', DATEPART(second,GETDATE()) as '秒', DATEPART(Millisecond,GETDATE()) as '毫秒', DATEPART(quarter,getdate()) as '季度', DATEPART(dayofyear,getdate()) as '從年初到現在的天數', DATEPART(weekday,getdate()) as '今天是這個星期的第幾天,從星期天開始', DATEPART(week,getdate()) as '今年的第幾周' --part簡寫 select GETDATE() as '系統當前日期' , DATEPART(YYYY, GETDATE()) as '年', DATEPART(MM,GETDATE()) as '月', DATEPART(DD,GETDATE()) as '天', DATEPART(HH,GETDATE()) as '小時', DATEPART(MI,GETDATE()) as '分', DATEPART(SS,GETDATE()) as '秒', DATEPART(MS,GETDATE()) as '毫秒', DATEPART(qq,getdate()) as '季度' , DATEPART(dy,getdate()) as '從年初到現在的天數', DATEPART(dw,getdate()) as '今天是這個星期的第幾天,從星期天開始', DATEPART(wk,getdate()) as '今年的第幾周'
SELECT datename(weekday, '2014-12-8') SELECT datename(YY, '2014-12-8')
select year('2014-01-12'), Month('2014-01-12'), DAY('2014-01-12')
select '19901221' as '給定的日期', dateadd(year,2,'19901221') as '加2年' , dateadd(year,-2,'19901221') as '減2年', dateadd(month,12,'19901221') as '加12個月', dateadd(month,-12,'19901221') as '減12個月', dateadd(day,31,'19901221') as '加31天', dateadd(day,-31,'19901221') as '減31天'
select datediff(year,'1988-12-21','1990-12-21'),--大的時間在后面 間隔為正數 datediff(year,'1990-12-21','1988-12-21')--大的時間在前面面 間隔為負數
Style ID | Style 格式 |
---|---|
100 或者 0 | mon dd yyyy hh:miAM (或者 PM) |
101 | mm/dd/yy |
102 | yy.mm.dd |
103 | dd/mm/yy |
104 | dd.mm.yy |
105 | dd-mm-yy |
106 | dd mon yy |
107 | Mon dd, yy |
108 | hh:mm:ss |
109 或者 9 | mon dd yyyy hh:mi:ss:mmmAM(或者 PM) |
110 | mm-dd-yy |
111 | yy/mm/dd |
112 | yymmdd |
113 或者 13 | dd mon yyyy hh:mm:ss:mmm(24h) |
114 | hh:mi:ss:mmm(24h) |
120 或者 20 | yyyy-mm-dd hh:mi:ss(24h) |
121 或者 21 | yyyy-mm-dd hh:mi:ss.mmm(24h) |
126 | yyyy-mm-ddThh:mm:ss.mmm(沒有空格) |
130 | dd mon yyyy hh:mi:ss:mmmAM |
131 | dd/mm/yy hh:mi:ss:mmmAM |
select GETDATE(), CONVERT(nvarchar(20),GETDATE(),120) as 'style=120', CONVERT(nvarchar(20),GETDATE(),101) as 'style=101', CONVERT(nvarchar(20),GETDATE(),112) as 'style=112'
cast()和convert()函數很相似,可以將表達式由一種數據類型轉換為另一種數據類型,但無法像convert()函數一樣設置時間格式
cast()是ANSI標準SQL,除非需要設置格式,否則優先選擇cast()轉換。
select CAST('100' as decimal(18, 2)) +11, --字符串轉換為decimal convert(decimal(18, 2),'100')+11,--字符串轉換為decimal '100'+11 --sql內部自動轉換為int
select DATEADD(YY,2,'2011')
dateadd年份相加時,月份天數時間都會為初始值??梢杂眠@個特性來求出第一天日期。
1.選擇一個日期為"中間值",算出今年和這個"中間值"相差多少年。
2.然后用"中間值"加上第一步中的求出相差的年份。
select DATEDIFF(yy,'2011',getdate()) --1.求出中間值2011和今年相差的年份為多少select DATEADD(yy, DATEDIFF(yy,'2011',getdate()), '2011')--2.然后用"中間值"加上第一步中的求出相差的年份。
"中間值"一般寫0,寫0時這個日期則為默認值'1900-01-01'
select DATEDIFF(yy,0,getdate())select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)select DATEDIFF(yy,'1900-01-01',getdate())select DATEADD(yy, DATEDIFF(yy,'1900-01-01',getdate()), '1900-01-01')
那么就上一年或者明年第一天就只需要在相差的年份后面加減即可
select DATEADD(yy, DATEDIFF(yy,0,getdate())-1, 0)--上一年開始一天select DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)--下一年開始一天select DATEADD(yy, DATEDIFF(yy,0,'2008'), 0)--2008年開始一天
那么求本年第N天的日期只需要加(N-1)天數即可
select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)+(101-1)--本年第101天的日期
那么求本月第一天的日期和第N天的日期,求本星期第一天和第N天的日期只需求改part部分即可
--本月的第一天 select DATEADD(mm, DATEDIFF(mm,0,getdate()),0) --本月的第13天 select DATEADD(mm, DATEDIFF(mm,0,getdate()),0)+(13-1) --本星期的第一天 select DATEADD(WK, DATEDIFF(WK,0,getdate()),0) --本星期的第三天 select DATEADD(WK, DATEDIFF(WK,0,getdate()),0)+(3-1)求本年最后一天的日期
先求出下一年第一天的日期然后減去3毫秒即可
select DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)--下一年第一天 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) --得到下一年的開始一天 然后在減去3毫秒
為什么是減3毫秒?別的可以嗎?
因為datetime類型的時間精度是3.33毫秒,如果超過該精度會進行近似到0.000,0.003,0.007 秒
select DATEADD(ms,-1, '2015-01-01 00:00:00.000') as '減1毫秒', DATEADD(ms,-2, '2015-01-01 00:00:00.000') as '減2毫秒', DATEADD(ms,-3, '2015-01-01 00:00:00.000') as '減3毫秒', DATEADD(ms,-4, '2015-01-01 00:00:00.000') as '減4毫秒', DATEADD(ms,-5, '2015-01-01 00:00:00.000') as '減5毫秒' select DATEADD(ms,-6, '2015-01-01 00:00:00.000') as '減6毫秒', DATEADD(ms,-7, '2015-01-01 00:00:00.000') as '減7毫秒', DATEADD(ms,-8, '2015-01-01 00:00:00.000') as '減8毫秒', DATEADD(ms,-9, '2015-01-01 00:00:00.000') as '減9毫秒', DATEADD(ms,-10, '2015-01-01 00:00:00.000') as '減10毫秒' select DATEADD(ms,-11, '2015-01-01 00:00:00.000') as '減11毫秒', DATEADD(ms,-12, '2015-01-01 00:00:00.000') as '減12毫秒', DATEADD(ms,-13, '2015-01-01 00:00:00.000') as '減13毫秒', DATEADD(ms,-14, '2015-01-01 00:00:00.000') as '減14毫秒', DATEADD(ms,-15, '2015-01-01 00:00:00.000') as '減15毫秒'
那么就上一年或者明年第一天就只需要在相差的年份后面加減即可
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) --上一年最后一天SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+2, 0))--下一年最后一天SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,'2008')+1, 0))--2008年最后一天
那么求本月最后一天的日期,求本星期最后一天日期只需求改part部分即可
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate())+1, 0)) --本月的最后一天 SE
新聞熱點
疑難解答