2012年4月30日 星期一

Transact-SQL 計算該月總天數


SQL Server 的日期部分,0 可代表 1900 年 1 月的第一天 (1900/01/01),-1 可代表 1899 年 12 月的最後一天 (1899/12/31),驗證如下:

select cast(0  as datetime)   -- 所得結果為 1900-01-01 00:00:00.000
select cast(-1 as datetime)   -- 所得結果為 1899-12-31 00:00:00.000

今假設欲計算 2012 年 2 月份總天數:

1). 取 -1 為其基準點,先算出該月份與 1899 年 12 月相距月數。可任意取該月份的某一天進行試算 (以 2012/02/10 為例),執行以下指令後得到結果為 1346,代表 1899 年 12 月 與 2012 年 2 月 相距 1346 個月。
select datediff(month, -1, '2012/02/10')   -- 所得結果為 1346


2). 將 1899 年 12 月的最後一天加上 1346 個月,便得到 2012 年 2 月最後一天
select dateadd(month, datediff(month, -1, '2012/02/10'), -1)   -- 所得結果為 2012-02-29 00:00:00.000


3). 以 day 指令讀出 "日" 部份即可
select day(dateadd(month, datediff(month, -1, '2012/02/10'), -1))   -- 所得結果為 29