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 回答
11

你也可以这样做:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'
于 2016-05-17T15:37:44.713 回答
8

这是因为DATEOracle 中的列也包含时间部分。该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 秒。

于 2011-07-19T16:16:42.680 回答