8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

今回は、JavaScriptとSQLの日付解釈の違いについて、
ありがちな例を用いて解説してみようと思います。

例えば以下のような2パターンのコードがあるとします。
※Node.jsのTypeORMを使用しています。

Aのコード

const hogeDate = "2023-07-30"
const date = new Date(hogeDate);

builder.andWhere('projects.hogeDate <= :hogeDate', { hogeDate: date });

Bのコード

builder.andWhere("projects.hogeDate <= DATE '2023-07-30'");

これらのコードは一見同じ結果になるように見えます。

何が問題なのか

まずAのコードですが、hogeDateはJavaScriptのDateオブジェクトとして作成されています。
JavaScriptのDateオブジェクトは、デフォルトでは実行環境のタイムゾーンに基づいて解釈されるため、dateの値は文字列hogeDate("2023-07-30")が自身のタイムゾーンに基づいて解釈された日付と時間になります。

それに対してBのコードでは、DATEを使ってSQLの日付リテラルを直接使用しています。
このためSQLサーバの設定により、タイムゾーンが異なる可能性があります。
SQLでは日付リテラルは通常であれば、UTCで解釈されるので、
"2023-07-30"はUTCでの"2023-07-30 00:00:00"を指すことになるということです。

まとめ

日付解釈問題は比較的あるあるかと思いますが、
使用しているデータベースとその日付や時間の解釈方法、および実行環境のタイムゾーン設定を考慮に入れて、日付/時間の比較を行うことが大事ということですね。

おしまい。

8
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?