Oracle DateTime 在 Where 子句中?

Posted

技术标签:

【中文标题】Oracle DateTime 在 Where 子句中?【英文标题】:Oracle DateTime in Where Clause? 【发布时间】:2011-10-08 15:03:10 【问题描述】:

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

-> 取大于号

有什么原因吗?

【问题讨论】:

您应该避免使用语言相关的日期格式。这可能会给不同的系统带来麻烦。您应该使用01 而不是JAN(当然还要加上适当的格式)以确保您的代码在任何系统上都可以正常运行。 【参考方案1】:

你也可以这样做:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

正如其他人在上面评论的那样,使用 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 比一天中的秒数少 1 秒。

【讨论】:

【参考方案4】:

是:TIME_CREATED 包含一个日期和一个时间。使用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_CREATED 上使用索引(如果存在)。 感谢您发布解决方案。它很快很容易找到。虽然我曾在其他 DBMS 上工作过,例如 Ingres、MS-SQL、MS-Access 和 DB2,但在我目前的任务之前我还没有与 Oracle 合作过。 为什么不使用BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1 @ajeh:我不喜欢between,因为它含糊不清。听起来好像它是排他性的,但实际上它是包容性的。这就是我避免它的原因。此外,在这个具体的例子中,它不会是一样的。【参考方案5】:

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

你应该使用:

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

【讨论】:

以上是关于Oracle DateTime 在 Where 子句中?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL,在 SELECT 标头中的子查询中返回唯一(最大)行(在 FROM、WHERE 之前)

如何在 Oracle DB 的 SQL 查询中传递 DateTime 参数

Oracle子查询

在oracle11g中,更新子表数据的时候我把子表的内码全部更新成一个值了,66万多条了,忘了加where条件了

Oracle优化笔记

oracle子查询