SQLServerの日付
TL;DR
- スラッシュ(/)区切りで日付を設定するときは、シングルクオーテーション(’)で囲む
datetime 型に Insert しようとすると
最近、Excel のデータを DB に投入する機会がありました。
単純に Insert 文を書いて入れようとしたのですが、データの種類として文字列や数値、そして日付が混ざっていたので「気をつけないと変に変換されそうだなー」と思っていました。
案の定、次のような SQL を書いて失敗しました。
1 | -- 日付を入れようとした失敗例 |
このクエリを実行してもエラーは出ません。でも、実際に設定される値は想定とは異なります。
1 | -- 実際に設定される値 |
原因は…
想定した「2020/1/1」が設定されなかった原因は、シングルクオーテーション(’)で囲んでいないからですね。
1 | -- 意図した日付が入る例 |
それから、なぜ「1905/7/14」が設定されるかというと、日付の区切りとして書いたスラッシュが割り算の記号として認識され、
1 | 2020/1/1 => 2020÷1÷1 => 2020 |
となって、結果的に
1 | -- シングルクオーテーションで囲まない場合 |
のような SQL が実行されて、日付をシリアル値で指定したことになるからです。
SQL Server は、1900 年 1 月 1 日を基準に計算するため、その 2020 日後の 1905 年 7 月 14 日が設定されるわけです。
まとめ
SQL Server で日付を設定するときは、値をシングルクオーテーションで囲みましょう。
さもないと、想定外の日付が設定されてしまいます。エラーは出ないので注意が必要です。