Sql Where子句中的Oracle DateTime?
我有类似这样的sql:Sql Where子句中的Oracle DateTime?,sql,oracle,time,date-arithmetic,Sql,Oracle,Time,Date Arithmetic,我有类似这样的sql: SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') ->这将返回10行和创建的时间='2011年1月26日' 现在,当我这样做的时候,我不会再收到任何回音 SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TIME_CREATED = TO_DATE('26/JAN/2011',
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')
->这将返回10行和创建的时间='2011年1月26日'
现在,当我这样做的时候,我不会再收到任何回音
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')
->取出大于
原因是什么?是:创建的时间包含日期和时间。使用
TRUNC
提取时间:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
更新:正如Dave Costa在下面的评论中指出的那样,这将阻止Oracle使用列
TIME\u 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
选择EMP\u名称、部门
来自员工
其中创建时间>=截止日期('2011年1月26日','dd/mon/yyyy')
创建时间<截止日期('2011年1月26日','dd/mon/yyyy')+1
这是因为Oracle中的日期列也包含时间部分。to_date()
函数的结果是时间设置为00:00:00
的日期,因此它可能与表中的任何行都不匹配
你应使用:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
正如上面其他人所评论的,使用TRUNC将阻止使用索引(如果在创建时有索引)。为了避免这个问题,可以将查询结构化为
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秒。您也可以使用以下内容将时间部分包括在查询中:
SELECT EMP_NAME
, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');
你也可以这样做:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'
请注意,此方法将阻止在创建索引时使用索引(如果存在)。感谢您发布解决方案。它很快很容易找到。虽然我曾在其他数据库管理系统上工作过,如Ingres、MS-SQL、MS Access和DB2,但在我目前的任务之前,我还没有与Oracle合作过。为什么不在截止日期('26/JAN/2011','dd/mon/yyyy')和截止日期('26/JAN/2011','dd/mon/yyyy')+1之间使用
?@ajeh:我不喜欢之间的,因为两者不明确。听起来好像它是排他性的,而实际上它是包容性的。这就是为什么我回避它。此外,在这个具体的例子中,情况就不一样了。你应该避免使用依赖于语言的日期格式。这可能会导致不同系统出现故障。您应该使用01
而不是JAN
(当然还有适当的格式),以确保您的代码在任何系统上都能正常运行。