はじめに
AccessでSQLを書いていると、「同じ日付なのに抽出結果がおかしい」という経験はありませんか?
私は先日、1か月前の日付と比較するWHERE句を書いていたところ、本来表示されないはずのデータが抽出されるという現象に遭遇しました。
原因は単純でしたが、意外と気付きにくいポイントだったので備忘録として残します。
発生した現象
条件としていた日付が
2026/10/15
のデータに対して、
1か月前の日付を取得するSQLを書いていました。
DateAdd(
"m",
-1,
CDate(
Left([条件日付],4) & "/" &
Mid([条件日付],5,2) & "/" &
Right([条件日付],2)
)
)
この結果は
2026/09/15
になります。
比較対象のデータは次の2件です。
| 比較日 |
|---|
| 2026/09/15 14:35:27 |
| 2026/09/16 14:35:27 |
私は
2026/09/15
は抽出されず、
2026/09/16
だけ抽出されると思っていました。
しかし実際には両方抽出されました。
原因
原因はDate型には「日付だけでなく時刻も含まれる」ためです。
今回比較していた値は
2026/09/15 00:00:00
になります。
一方、テーブルの値は
2026/09/15 14:35:27
です。
WHERE句では
2026/09/15 14:35:27
>
2026/09/15 00:00:00
という比較になるため、
結果はTrueになります。
つまり「同じ日付」に見えていても、時刻まで比較されていたということです。
解決方法
日付だけを比較したい場合は、比較対象から時刻を除外します。
例えば DateValue() を使用すると、日付だけで比較できます。
DateValue([比較日])
または、比較する値・比較される値のどちらも日付だけに揃える方法でも問題ありません。
今回学んだこと
私は最初、
「SQLがおかしい」
と思っていました。
しかし実際にはSQLではなく、Date型の仕様を理解できていなかっただけでした。
日時型は画面では日付しか表示されていなくても、内部では時刻まで保持していることがあります。
日付比較で思った通りの結果にならない場合は、まず「時刻が含まれていないか」を疑ってみることをおすすめします。
まとめ
今回の原因は以下のとおりです。
- Date型には時刻も含まれる
2026/09/15は2026/09/15 00:00:00として扱われる2026/09/15 14:35:27はそれより大きいため抽出される- 日付だけ比較したい場合は
DateValue()などで時刻を除外する
今回も現場で実際にハマった内容でした。
同じような現象で悩んでいる方の参考になれば幸いです。


コメント