Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Where子句中的Oracle DateTime?_Sql_Oracle_Time_Date Arithmetic - Fatal编程技术网

Sql Where子句中的Oracle DateTime?

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',

我有类似这样的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','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
(当然还有适当的格式),以确保您的代码在任何系统上都能正常运行。