1

日付を計算する際に次の要件を実装するのに誰かが間違っているコードを理解しようとしています:

派生した JE_ACCTNG_DT は、フィードが作成されて送信される現在の年の前月の最終日に等しく設定されます。
たとえば、現在の年が 2013 年の場合、JE_ACCTNG_DT は、フィードが送信される四半期に基づいて次のようになります。

  • JE_ACCTNG_DT = 2013 年 4 月 1 日に送信された第 1 四半期のフィードの場合は 3/31/2013
  • JE_ACCTNG_DT = 2013 年 7 月 1 日に送信された第 2 四半期のフィードの場合は 6/30/2013
  • 2013 年 10 月 1 日に送信された第 3 四半期のフィードの JE_ACCTNG_DT = 2013 年 9 月 30 日
  • 2014 年 1 月 1 日に送信された第 4 四半期のフィードの場合、JE_ACCTNG_DT = 12/31/2013

誰かがこのようなコードを実装したことがわかり、日時の結果が日付データ型に変換された場合 (時間部分が削除された場合)、要件に示されている例に対して正しい答えが得られるようです。

DECLARE @FEED_DT datetime 

SET @FEED_DT = '4/1/2013'
select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))


SET @FEED_DT = '7/1/2013'
select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))
--2013-06-30 23:59:59.000

SET @FEED_DT = '10/1/2013'
select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))
--2013-09-30 23:59:59.000


SET @FEED_DT = '1/1/2014'
select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))
--2013-09-30 23:59:59.000

私を混乱させているのは、DATEDIFF 関数が次の引数を受け入れることです: datepart と 2 つの日付

DATEDIFF (日付部分、開始日、終了日)

上記に気付いた場合、コードは日付部分を「m」に設定しましたが、日付が予想されるときに 2 番目のパラメーターにゼロを渡しました。

DECLARE @FEED_DT datetime = '4/1/2013'
DECLARE @DateAddResult as int 

SET @DateAddResult = DATEDIFF(m,0,@FEED_DT)
select @DateAddResult 
--1359
select DATEADD(s,-1,DATEADD(mm, @DateAddResult,0))
--2013-03-31 23:59:59.000

コードは実際に何をしているのですか?私はエラーを期待していたでしょう。0 値を日付に強制しましたか?

要件が本当にあるべきことは、前四半期の最終日を計算することだと考えています。これは私がそれを行う方法です。

SELECT dateadd(day, -1, DATEADD(quarter,DATEDIFF(quarter,'1900/01/01', GETDATE()), '1900/01/01')) as FirstDayOfQuarter
4

2 に答える 2