Home > 開発者ブログ > intra-mart > SQLテクニック(1) 日付型をWHERE句で比較する際の注意点(Oracle)

SQLテクニック(1) 日付型をWHERE句で比較する際の注意点(Oracle)

 

20050826-clay

 

以下のような消費税率マスタテーブルがあるとします。

TAXRATE_TBL

—————————————————————————————–
TAXRATE  STARTDATE  ENDDATE
(NUMBER)  (DATE)   (DATE)
—————————————————————————————–
0.03             1989/04/01       1997/03/31
0.05             1997/04/01       2014/03/31
0.08             2014/04/01       2100/12/31
※データベースはOracle
※STARTDATEとENDDATEには、時分秒は入れない

 

上記のテーブルから現在日付に沿ったTAXRATEを取得する場合に、以下のようなSQLを書きました。

 

【SQL例】

SELECT
 TAXRATE
FROM
 TAXRATE_TBL
WHERE
 SYSDATE ≧ STARTDATE
AND
 SYSDATE ≦ ENDDATE

しかし、このWHERE句では問題があります。

 

■SYSDATE(時刻あり)と時刻なしカラムで比較をしている 

 

SYSDATE ≧ STARTDATE
AND
SYSDATE ≦ ENDDATE

 

これでは、2014/03/31 00:00:00 ~ 2014/03/31 23:59:59の間は値を取れません。

 1.TAXRATE_TBL.STARTDATEは日付のみしか持っていません。
 2.しかし、SYSDATEは日付+時間まで取得します。

 

現在時刻(SYSDATE)が2014/03/31 00:00:01とします。

 2014/03/31 00:00:01 ≧ 1997/04/01 00:00:00 ← ○
AND
 2014/03/31 00:00:01 ≦ 2014/03/31 00:00:00 ← ×

これでは、2014/03/31 00:00:01 ~ 2014/03/31 23:59:59の間はどこにもヒットしません。


正しくは、
WHERE
 TRUNC(SYSDATE) ≧ STARTDATE
AND
 TRUNC(SYSDATE) ≦ ENDDATE

または

WHERE
 TO_DATE(TO_CHAR(SYSDATE),'YYYY/MM/DD') ≧ STARTDATE
AND
 TO_DATE(TO_CHAR(SYSDATE),'YYYY/MM/DD') ≦ ENDDATE

の様に、SYSDATE側の時刻をカットします。

2014年02月17日(月)

テレマーケティングシステムsakuraトライアル

コールセンターシステム sakuraCTI

資料請求

お問合わせ

コラム

用語集

開発者ブログ

イントラマート

Sakuraテレマーケティングシステム

 

 

営業リスト

インフラソリューションのご案内

導入事例

テレアポノウハウ本プレゼントキャンペーン

認証マーク

アースリンクは
プライバシーマークを
取得しています。

プライバシーポリシー


SSLとは?

当サイトでは、実在性の証明とプライバシー 保護のためSSLサーバ証明書を使用しSSL 暗号化通信を実現しています。

このページの先頭へ