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'