SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
上記のクエリは、12月31日の初めの深夜の日時値を示します。これは、1年の最後の瞬間よりも約24時間短い時間です。 12月31日に発生する可能性のある時間を含める場合は、<
を使用して翌年の最初の日と比較する必要があります。 比較。または、今年の最後の数ミリ秒と比較することもできますが、DATETIME以外のもの(DATETIME2など)を使用している場合は、それでもギャップが残ります。
SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear
その他の期間
このアプローチには2つの優れた側面があります。パフォーマンスが優れていることと、yy
の両方のオカレンスを置き換えることで他の期間に簡単に変更できることです。 (=年)別の文字列:
yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(週に注意してください。開始日はサーバーの設定によって異なります。)
技術の詳細
これは、1900年からの年数をDATEDIFF(yy, 0, GETDATE())
で計算することで機能します。 次に、それをゼロの日付=1900年1月1日に追加します。これは、GETDATE()
を置き換えることにより、任意の日付で機能するように変更できます。 DATEDIFF(...)
を置き換えることによる部分または任意の年 「Year-1900」で機能します。
SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015