Oracle WhereTime在Where子句中?

我有这样的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') 

– >超出了

任何原因为什么?

是:TIME_CREATED包含date和时间 。 使用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 

您还可以使用以下内容在查询中包含TIME部分:

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

这是因为Oracle中的DATE列还包含时间部分。 to_date()函数的结果是时间设置为00:00:00的date,因此它可能不匹配表中的任何行。

你应该使用:

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

正如其他人已经评论过上面,使用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比一天中的秒数less1秒。

你也可以这样做:

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