SQL 速習チュートリアル

SQL 日付の操作

データベースで日付を扱う際に最も難しいのは、挿入または選択しようとしている日付のフォーマット(format)が、データベースのカラムで定義されているフォーマットと一致しているかを確認することです。

1. SQL の日付データ型

各 SQL データベースには、日付や時刻の値を保存するためのさまざまな**データ型(data types)**が用意されています。

1.1 MySQL の日付データ型

MySQL には以下のような日付データ型があります。

  • DATE: フォーマット YYYY-MM-DD
  • DATETIME: フォーマット YYYY-MM-DD HH:MI:SS
  • TIMESTAMP: フォーマット YYYY-MM-DD HH:MI:SS
  • TIME: フォーマット HH:MI:SS
  • YEAR: フォーマット YYYY または YY

1.2 SQL Server の日付データ型

SQL Server には以下のような日付データ型があります。

  • DATE: フォーマット YYYY-MM-DD
  • DATETIME: フォーマット YYYY-MM-DD HH:MI:SS
  • SMALLDATETIME: フォーマット YYYY-MM-DD HH:MI:SS
  • TIME: フォーマット HH:MI:SS
  • TIMESTAMP: 一意の数値(日付とは異なります)

       注記: 日付データ型は、データベース内に新しいテーブルを作成する際にカラム(column)に対して定義されます。

2. SQL での日付操作

例として、以下の「Orders」テーブルを見てみましょう。

Orders テーブル

OrderIdProductNameOrderDate
1Geitost2025-11-11
2Camembert Pierrot2025-11-09
3Mozzarella di Giovanni2025-11-11
4Mascarpone Fabioli2025-10-29

このテーブルから、OrderDate が 「2025-11-11」 のレコードを選択したいとします。その場合、以下の SELECT ステートメントを使用します。

SELECT * FROM Orders WHERE OrderDate='2025-11-11'

結果セット(result-set)は以下のようになります。

OrderIdProductNameOrderDate
1Geitost2025-11-11
3Mozzarella di Giovanni2025-11-11

       注記: 時刻成分(time component)が含まれていない場合、2つの日付の比較は非常に容易です。

2.1 時刻成分が含まれる場合の注意点

次に、「Orders」テーブルが以下のようになっていると仮定してください(OrderDate カラムに時刻成分が追加されている点に注目してください)。

OrderIdProductNameOrderDate
1Geitost2025-11-11 13:23:44
2Camembert Pierrot2025-11-09 15:45:21
3Mozzarella di Giovanni2025-11-11 11:12:01
4Mascarpone Fabioli2025-10-29 14:56:59

ここで先ほどと同じ SELECT ステートメントを使用してみます。

SELECT * FROM Orders WHERE OrderDate='2025-11-11'

この場合、結果は得られません。 なぜなら、このクエリは時刻部分を持たない日付のみを検索しているからです。

       Tips: クエリをシンプルに保ちメンテナンス性を高めるために、どうしても必要な場合を除き、日付データに時刻成分を含めないように設計することをお勧めします。