底辺過ぎてちょっとビビる

26歳からIT業界にいるエンジニアが、まったく成長できてないことを確認するブログ。備忘録的に使いたいとも考えています。

【Oracle】DATE型をWHERE句で比較するときの注意点

今日たぶん人生で初めてDATE型のデータをSQL文のWHERE句の条件で使った気がする。

比較条件の使い方を完全に勘違いしていたので、メモ書きとして
今後のために残しておく。

 

ピンポイントでSTART_DATEが2017-6-29のレコードが取得されるように、
こんなSQLを書いた。

SELECT
*
FROM
TABLE_A
WHERE
START_DATE = '2017-06-29';

START_DATEはDATE型で定義されていて、実際にレコードには「2017-06-29」というデータが入っているのだけど、
いくら実行しても、結果は表示されず。

なんでだろう~、と思ってググったところ
そもそもDATE型は「=」で結ぶような比較は出来ないということが判明した。


では、どうやって比較すればいいのか。


その前に、DATE型に格納されている値について確認しておく。
表示上、「2017-2-29」とされていても実データの方には、
「2017-2-29 00:00:00」といった感じで時分秒まで格納されているのだ。


ということを踏まえると前述のSQLの場合、

SELECT
*
FROM
TABLE_A
WHERE

START_DATE > TO_DATE('2017-6-28', 'YYYY/MM/DD')
AND START_DATE < TO_DATE('2017-6-30', 'YYYY/MM/DD'); 


という、SQL文になる。一旦、TO_DATE書式を使って、書式をそろえる。
(実際はいちいちTO_DATE書式に揃えずとも問題ない)

時分秒まで指定したい場合は、

  TO_DATE('2017-6-29 12:12:12', 'YYYY/MM/DD HH24/MI/SS');


のように記述する。

DATE型の比較については、BETWEENを使う方法もある。
範囲で検索結果を取得したい場合に有効。

以下の場合、2017-6-28の00:00:00から2017-6-30の23:59:59までに該当する
レコードが検索結果として取得される。

 START_DATE BETWEEN TO_DATE('2017-6-28', 'YYYY/MM/DD') 
 AND TO_DATE('2017-6-30', 'YYYY/MM/DD') 

※間違えていたらぜひ指摘してください('ω')ノ


スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ)

スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

徹底攻略 Java SE 7/8 Bronze 問題集[1Z0-814]対応

徹底攻略 Java SE 7/8 Bronze 問題集[1Z0-814]対応