SQLでうるう年を判定する [SQLServer, MySQL]

先日2人のプログラマーさんが、それぞれうるう年の判定をSQLで記述していました。
片方のプログラマーさんは、マイクロソフトのドキュメントに記載されている方法でうるう年を判別していました。
もう片方のプログラマーさんは、独自の方法でうるう年の判別を行っていました。
今回は2人のプログラマーさんが行っていたうるう年の判定について記載します。

マイクロソフトのドキュメント記載のやり方

マイクロソフトのドキュメントにはうるう年の判定方法として次のように記載されています。

年がうるう年かどうかを判断する方法

年が閏年かどうかを判断するには、次の手順を実行します。

  1. 年が4で割り切れる場合は、手順2に進みます。 それ以外の場合は、手順5に進みます。
  2. 年が100で割り切れる場合は、手順3に進みます。 それ以外の場合は、手順4に進みます。
  3. 年が400で割り切れる場合は、手順4に進みます。 それ以外の場合は、手順5に進みます。
  4. 年はうるう年 (1 年366日) です。
  5. 年はうるう年ではありません (365 日)。

出典: 年が閏年かどうかを判断するメソッド

上記のルール(仕様)をもとにSQLを組むと以下のようになります。

指定した年がうるう年であれば1が表示され、うるう年でなければ0が表示されます。

実行結果

SQLでうるう年を判別する1

日付として正しいかどうかを判定するやり方

日付として正しいかどうかを判定する方法は簡単です。
年に2月29日を足して、日付かどうかを関数で判別します。
以下、SQLServerでの例です。

実行結果

SQLでうるう年を判別する2

MySQLではISDATE関数がないので、DAYOFYEAR関数を使って日付が正しいかどうかを判定します。
DAYOFYEAR関数は渡された値が日付として正しくない場合にNULLを返します。ですので、戻り値がNULLかどうかを検査してあげれば日付として正しいかどうかが分かります。

関数を作成して試してみる

それぞれの処理をユーザー定義関数として作成して結果を見てみます。

関数作成SQL

マイクロソフト仕様のSQLを関数化

2月29日の日付判定仕様のSQLを関数化

関数を呼び出して結果を確認

関数を呼び出してうるう年かどうかの結果を取得します。
対象の年は「2016年」~「2020年」にします。2016年と2020年はうるう年のはずです。

関数実行SQL

実行結果

SQLでうるう年を判別する3

それぞれの関数で同様の結果を取得することができました。