Oracle の add_months を SQL Server に実装する

昨日これ書いたので
Oracle の add_months を SQL Server dateadd(month, ~) の結果と同じにするのを考えてみる‏ - お だ のスペース
どうせなら逆も用意しようかなと。*1

add_months から dateadd(month, ~) は、元が月末の時は、必ず月末になるようにしたら良さそう。*2

SQL Server 2012 以降なら、月末日を取る + 月の加算もしてくれる eomonth があります。
EOMONTH (Transact-SQL)
この blog でも以前取り上げてました。
月末日を取得する - お だ のスペース

移行する方で、今更 2008 とか居ないと思うので、eomonth 使って書いてます。

CREATE FUNCTION [ADD_MONTHS] 
(
  @target date, 
  @plus int
)
RETURNS date
AS
BEGIN
  DECLARE @ret date

  select @ret = case 
    when eomonth(@target) = @target then eomonth(@target, @plus) 
    else dateadd(month, @plus, @target) 
  end

  RETURN @ret

END
GO

ファンクション作らないならこんな感じ。

select 
  case 
    when eomonth(cast(getdate() as date)) = cast(getdate() as date) 
      then eomonth(cast(getdate() as date), 2) 
    else 
      dateadd(month, 2, cast(getdate() as date)) 
  end as ADD_MONTHS

多分ちゃんと動きます。

*1:Oracle から SQL Server への移行される方のために!

*2:時刻は無視します。