Sybase ASE v15.x中查詢本月最後一天的日期的3種實現方法

原文鏈接:http://www.dbainfo.net/sybase-ase-current-date-last_day.htm

本文爲andkylee個人原創,請在尊重作者勞動成果的前提下進行轉載;

 

 

     Oracle中查詢月底那天的日期的函數爲:last_day()。 在ASE中沒有對應的函數,在Oracle移植到Sybase的時候,需要手動編寫函數來實現,幸虧ASE15.0.2後開始支持自定義函數。

下面提供3種實現查詢本月最後一天的日期的SQL語句:

第一種:

select dateadd(dd,-1,convert(char(8),(datepart(yy,dateadd(mm,1,getdate()))*10000+datepart(mm,dateadd(mm,1,getdate()))*100+01)))
go

將本月的下一個月的年份和月份提取出來,以數字的形式相加,然後轉化成類似YYYYMMDD的這種日期格式。最後直接取下個月的第一天的前一天即可。在ASE中字符串 '20110101' 和 convert(datetime,'20110101') 是相等的。

第二種:

select dateadd(dd,-1, convert(datetime,left(convert(varchar, dateadd(mm,1,getdate()) ,112),6) + '01') )
go

先將當前日期的下一個月的日期顯示成YYYYMMDD的格式,取前6個字符和01拼接成下一月的第一天的日期,然後取前一天即可。convert函數中style的樣式,請參考:Sybase ASE convert函數中的style日期時間樣式

或者下面的寫法:

select dateadd(dd,-1,  left(convert(varchar, dateadd(mm,1,getdate()) ,112),6) + '01'  )
go

思路是一樣的。

第三種:

SELECT DATEADD(DD, -DAY(DATEADD(MM, 1, getdate() )), DATEADD(MM, 1, getdate() )) 
go

此方法的思路爲:計算當前日期的下一月的那天的前N天的日期,N爲當前日期在本月的天數。

改進成類似Oracle中的last_day()的函數如下:

第一種:

create function last_day(@d datetime)
returns datetime
as
begin
declare @rtndate datetime
select @rtndate = dateadd(DD,-day(dateadd(MM,1,@d)),dateadd(MM,1,@d) )
return @rtndate
end
go

第2種:

create function dbo.last_day2(@current_date datetime)
returns datetime
as
begin
  return dateadd(dd,-1, left(convert(varchar, dateadd(mm,1,@current_date) ,112),6) + '01'  )
end
go

實現效果如下:

1> select dbo.last_day(getdate()) ,dbo.last_day2(getdate() )
2> go

-------------------------- --------------------------
        Nov 30 2010  4:19PM        Nov 30 2010 12:00AM

(1 row affected)
1> select dbo.last_day('19991231') ,dbo.last_day2('19991231' )
2> go

-------------------------- --------------------------
        Dec 31 1999 12:00AM        Dec 31 1999 12:00AM

(1 row affected)
1> select dbo.last_day('20100228') ,dbo.last_day2('20100228' )
2> go

-------------------------- --------------------------
        Feb 28 2010 12:00AM        Feb 28 2010 12:00AM

(1 row affected)
1> select dbo.last_day('20000228') ,dbo.last_day2('20000228' )
2> go

-------------------------- --------------------------
        Feb 29 2000 12:00AM        Feb 29 2000 12:00AM

(1 row affected)
1>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章