TL;DR

  • スラッシュ(/)区切りで日付を設定するときは、シングルクオーテーション(’)で囲む

datetime 型に Insert しようとすると

最近、Excel のデータを DB に投入する機会がありました。

単純に Insert 文を書いて入れようとしたのですが、データの種類として文字列や数値、そして日付が混ざっていたので「気をつけないと変に変換されそうだなー」と思っていました。

案の定、次のような SQL を書いて失敗しました。

1
2
-- 日付を入れようとした失敗例
INSERT INTO Table_1 VALUES (2020/1/1);

このクエリを実行してもエラーは出ません。でも、実際に設定される値は想定とは異なります。

1
2
3
4
-- 実際に設定される値
Datetime
---------------------------
1905-07-14 00:00:00.000

原因は…

想定した「2020/1/1」が設定されなかった原因は、シングルクオーテーション(’)で囲んでいないからですね。

1
2
-- 意図した日付が入る例
INSERT INTO Table_1 VALUES ('2020/1/1');

それから、なぜ「1905/7/14」が設定されるかというと、日付の区切りとして書いたスラッシュが割り算の記号として認識され、

1
2020/1/1 => 2020÷1÷1 => 2020

となって、結果的に

1
2
-- シングルクオーテーションで囲まない場合
INSERT INTO Table_1 VALUES (2020);

のような SQL が実行されて、日付をシリアル値で指定したことになるからです。

SQL Server は、1900 年 1 月 1 日を基準に計算するため、その 2020 日後の 1905 年 7 月 14 日が設定されるわけです。

まとめ

SQL Server で日付を設定するときは、値をシングルクオーテーションで囲みましょう。
さもないと、想定外の日付が設定されてしまいます。エラーは出ないので注意が必要です。