1. ホーム
  2. sql

[解決済み] 今年の元日と最終日を知るには?

2022-07-12 22:25:17

質問

SQL Server 2000 を使用して、現在の年の最初の日付と最後の日付を取得するにはどうすればよいですか。

期待される出力

01/01/2012 そして 31/12/2012

どのように解決するのですか?

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

上記のクエリは、12月31日午前0時というdatetimeの値を与えます。これは、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

その他の期間

この方法には二つの良い点があります:パフォーマンスが良いこと、そして yy (=year)を別の文字列で置き換えることで、他の期間にも簡単に変更できます。

yy, yyyy    year
qq, q       quarter
mm, m       month
wk, ww      week 

(週数に注意: 開始日はサーバの設定に依存します)

技術的な詳細

これは、1900年からの年数を計算することによって動作します。 DATEDIFF(yy, 0, GETDATE()) で1900年からの年数を計算し、それをゼロ = 1900年1月1日の日付に足すことで動作します。これは、任意の日付に対して動作するよう GETDATE() の部分を置き換えることで、任意の日付、または任意の年に対して動作するように変更することができる。 DATEDIFF(...) 関数を "年 - 1900." に置き換えることで、任意の年を指定することができます。

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015