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 テーブル
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2025-11-11 |
| 2 | Camembert Pierrot | 2025-11-09 |
| 3 | Mozzarella di Giovanni | 2025-11-11 |
| 4 | Mascarpone Fabioli | 2025-10-29 |
このテーブルから、OrderDate が 「2025-11-11」 のレコードを選択したいとします。その場合、以下の SELECT ステートメントを使用します。
SELECT * FROM Orders WHERE OrderDate='2025-11-11'結果セット(result-set)は以下のようになります。
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2025-11-11 |
| 3 | Mozzarella di Giovanni | 2025-11-11 |
注記: 時刻成分(time component)が含まれていない場合、2つの日付の比較は非常に容易です。
2.1 時刻成分が含まれる場合の注意点
次に、「Orders」テーブルが以下のようになっていると仮定してください(OrderDate カラムに時刻成分が追加されている点に注目してください)。
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2025-11-11 13:23:44 |
| 2 | Camembert Pierrot | 2025-11-09 15:45:21 |
| 3 | Mozzarella di Giovanni | 2025-11-11 11:12:01 |
| 4 | Mascarpone Fabioli | 2025-10-29 14:56:59 |
ここで先ほどと同じ SELECT ステートメントを使用してみます。
SELECT * FROM Orders WHERE OrderDate='2025-11-11'この場合、結果は得られません。 なぜなら、このクエリは時刻部分を持たない日付のみを検索しているからです。
Tips: クエリをシンプルに保ちメンテナンス性を高めるために、どうしても必要な場合を除き、日付データに時刻成分を含めないように設計することをお勧めします。