2011年5月1日 星期日

sybase 取得月天數

如何使用SQL ,代入日期,取得當月天數? 例: 傳入 1/23  return 31,傳入  2/10 return 28(潤年29)




declare @adate datetime
select @adate = getdate()


select 1,convert(varchar(25),@adate,101) as Date_Value, ''Today'' As Date_Type
union
select 2,convert(varchar(25),dateadd(dd,-(day(@adate)-1),@adate),101) as Date_Value, ''First_Day_of_Month'' As Date_Type
union
select 3,convert(varchar(25),dateadd(dd,-(day(@adate)),@adate),101) , ''Last_Day_of_Previous_Month''
union
select 4,convert(varchar(25),dateadd(dd,-(day(dateadd(mm,1,@adate))),dateadd(mm,1,@adate)),101) ,''Last_Day_of_Current_Month''
union
select 5,convert(varchar(25),dateadd(dd,-(day(dateadd(mm,1,@adate))-1),dateadd(mm,1,@adate)),101) ,''First_Day_of_Next_Month'' 

select 4 的那項,是不論傳入的日期是哪一天,都會回傳,這個月的最後一天回來。

說明: 就是把現在日期加上一個月 再去減掉 dayOfMonth,例如 傳入日期是 X月20號,加上一個月,就變成 X+1 月的20號,這時再減去20天,理論上就是X月的最後一天了。

在寫說明的同時想到,如果 傳入的是大月的最後一天,例如 3月31號,加上一個月後,會是什麼呢? 4月30號? 或是 5月1號?
如果是5月1號的話,這方法就錯了。如果是回傳4月30號,那此方法還是ok的。



參考來源:http://www.databasejournal.com/img/2006/02/get_first_last.sql

-----------------------------------------------
後續測試 : 在 Sybase IQ 12.7.0 下測試
select dateadd(mm,1,'2011/01/31') → 2011-02-28 00:00:00.0
select dateadd(mm,1,'2011/01/32') → ASA Error -157: Cannot convert 2011/01/32 to a timestamp
所以它不像javascript 一樣,會自動幫你進位。不過 上述用來查出當月最後一天的語法是可以用的。

註二:在MySql 中,要選出月的最後一天( last day of month)就簡單多了,直接呼叫內建函數 LAST_DAY(date) 就可以
例: select LAST_DAY('2011/02/3')   或  select LAST_DAY(now())

沒有留言: