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'