Where句のOracleDateTime?


84

私は次のようなSQLを持っています:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')

->これは10行を返し、TIME_CREATED = '26 -JAN-2011 '

これを行うと、行が返されません。

SELECT EMP_NAME, DEPT
    FROM EMPLOYEE
    WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')

->大なり記号を取りました

理由は何ですか?


4
言語に依存する日付形式は避けてください。これは、さまざまなシステムで問題を引き起こす可能性があります。あなたは使用する必要があります01代わりに、JAN必ずあなたのコードは、任意のシステム上で問題なく動作します作るために(プラスコースのapproriate形式)。
a_horse_with_no_name 2013

回答:


149

はい:TIME_CREATEDには日付と時刻が含まれています。TRUNC時間を取り除くために使用します。

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

更新:
Dave Costaが以下のコメントで指摘しているように、これにより、Oracleが列のインデックスがTIME_CREATED存在する場合にそれを使用できなくなります。この問題のない代替アプローチはこれです:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') 
      AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1

14
このアプローチでは、TIME_CREATEDにインデックスが存在する場合、その使用が防止されることに注意してください。
デイブ・コスタ

ソリューションを投稿していただきありがとうございます。すばやく簡単に見つけることができました。Ingres、MS-SQL、MS-Access、DB2などの他のDBMSで作業したことがありますが、現在の割り当ての前にOracleで作業したことはありません。
Jason TEPOORTEN 2012年

使ってみませんBETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1か?
ajeh 2013

2
@ajeh:betweenあいまいさのために私は好きではありません。実際には包括的であるのに、それは排他的であるかのように聞こえます。だから私はそれを避けます。さらに、この具体的な例では、同じではありません。
ダニエルヒルガース

28

以下を使用して、クエリにTIME部分を含めることもできます。

SELECT EMP_NAME
     , DEPT
  FROM EMPLOYEE 
 WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');

8

次のこともできます。

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'

7

これはDATE、Oracleの列に時間部分も含まれているためです。to_date()関数の結果は、時刻がに設定された日付です。00:00:00、テーブルのどの行とも一致しない可能性があります。

次を使用する必要があります。

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

5

他の人が上でコメントしたように、TRUNCを使用すると、インデックスを使用できなくなります(TIME_CREATEDにインデックスがあった場合)。この問題を回避するために、クエリは次のように構成できます。

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') 
            AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second;

86399は、1日の秒数より1秒少ないです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.