おすすめアイテムをいくつか紹介

広告ブロックがONになっていると表示されないことがあります。

【Oracle】Where句で日付の範囲を指定したのに上手く取得ができない

お疲れ様です。
はるさらでございます。

今回は研修中の生徒から尋ねられた内容を
備忘録として残しておきたいと思います。

 

事象:
「Where句で日付の範囲を指定したのですが
思ったように表示されない・・・」

 

とのことでした。
詳しく話を聞いてみると

「A日~B日までのデータを抽出したいのに
なぜかB日が除外されてしまう。」

らしいです。

実行していたSQL

SELECT * FROM LibraryHistory
where to_date('2016/02/04','YYYY/MM/DD') <= LendingDay
and to_date('2020/11/06','YYYY/MM/DD') >= LendingDay;

「LibraryHistory」という表から、
「LendingDay」という日付型の項目が
2016/02/04~2020/11/06の期間のレコードを
抽出するという構文でした。
(betweenは? という指摘は無しでお願いします・・・)

 

「LibraryHistory」テーブルの中身

想定ではSQLを実行して
3レコード抽出されてほしいところです。

 

 

実行結果

実際に抽出されたレコードがこちら

 

・・・2レコードしか出力されませんでした。

では、なぜ同じ日付なのに
ID=2のレコードが表示されなかったのでしょうか??

 

 

原因

それでは今回上手くいかなかった理由を
探っていきましょう。

 

生徒より

「2016/02/04~2020/11/06の期間での指定ではダメでしたが
2016/02/04~2020/11/07にしたら、
6日までレコードが取れました!!」

 

との報告があったため
年月日以降がどう設定されているかが気になりました。

 

結果が下記になります。

 

年月日以降の値も
登録されていることが分かりました!

 

where句では年月日までしか指定していないため
LendingDayが「2020/11/06 00:00:00」までの
レコードを探しに行きます。

上記の画像で分かる通り、
抽出から漏れていたID=2 の

「信長伝」は「2020/11/06 17:48:40」

で登録されているため
表示する対象から外れてしまいました。

insert時にSYSDATEを使用したことで、
日付以降の情報も入ってしまったらしいです。

今回は実行したSelect文には問題がありませんでしたが
データの仕込みに考慮が足りなかったことが原因でした。

それではまたー!!