97

私は次のような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

5 に答える 5

167

はい: 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
于 2011-07-19T15:06:26.840 に答える
35

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

SELECT EMP_NAME
     , DEPT
  FROM EMPLOYEE 
 WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');
于 2011-07-20T08:58:17.917 に答える
8

これは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')
于 2011-07-19T15:07:10.830 に答える
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秒少ないです。

于 2011-07-19T16:16:42.680 に答える