轉載於:http://www.w3dev.cn/article/20110125/sql-compute-birthdate-now-days.aspx
SQL語句計算距離生日還差幾天原理很簡單,將要比較的2個日期的年份統一成一樣的,然后再使用datediff函數計算記錄的數據和當前的日期比較得到相距的天數。
將年份統一成一樣的時候需要注意瑞年的問題,需要將當前的時間的年份統一成記錄的,而不是將記錄的年份統一成當前日期的年份。要不當前為平年,當記錄為瑞年並且為2月29號時間轉換就出錯了。具體示例看下面的示例
要實現年份統一可以使用字符串操作函數substring,或者時間操作函數datepart。
下面為SQL語句計算距離生日還差幾天的具體代碼,創建時間為記錄時間的【如同生日一樣】。
--第一種方法,substring函數操作,將記錄年份統一為當前的,當當前為平年碰到記錄為瑞年的2月29號會出錯,除非當前年豐也為瑞年,這個語句有錯誤,不推薦 declare @d datetime set @d=getdate() select addtime,datediff(dd,getdate(),convert(char(4),getdate(),120)+'-'+substring(convert(char(10),addtime,120),6,5))as days,id from information order by id print datediff(ms,@d,getdate())
正確寫法1:
--第一種方法,substring函數操作,更正后,年份要和生日的一直才行。要不碰到瑞年的記錄會出錯 耗時大概350ms左右 declare @d datetime set @d=getdate() select addtime,datediff(dd,convert(char(4),addtime,120)+'-'+substring(convert(char(10),getdate(),120),6,5),addtime)as days from information print datediff(ms,@d,getdate())
正確寫法2:
--第二種方法,datepart函數操作,耗時大概150ms左右 declare @d datetime set @d=getdate() select addtime,datediff(dd ,cast(datepart(yyyy,addtime) as char(4))+'-'+cast(datepart(mm,getdate()) as char(4))+'-'+cast(datepart(dd,getdate()) as char(4)) ,addtime)as days from information print datediff(ms,@d,getdate())
執行效果如下:
declare @d datetime set @d=getdate() //獲取當前時間 select 事務所主任ID,創建時間,datediff(dd ,cast(datepart(yyyy,創建時間) as char(4))+'-'+cast(datepart(mm,getdate()) as char(4))+'-'+cast(datepart(dd,getdate()) as char(4)) ,創建時間)as days from [TRA].[dbo].[事務所主任] print datediff(ms,@d,getdate())
執行結果如下:
應用場景:我們可以取days >= 0,獲取今年員工有效的生日,(畢竟現在企業很多都有生日福利,人事可以采用這樣的方式進行統計)