如何在Oracle中比较日期?

时间:2015-10-06 14:14:33

标签: sql oracle date-arithmetic

我遇到了一些问题,我认为这是一个简单的问题,但谷歌搜索并没有帮助很大的负担。可能我对我正在寻找的东西不好了。

SELECT ORDER_NUMB, CUSTOMER_NUMB, ORDER_DATE
FROM ORDERS
WHERE FORMAT(ORDER_DATE, 'DD-MMM-YYYY') = '07-JUN-2000';

它告诉我我使用的是无效的标识符。我尝试使用MON代替MMM,但这也无济于事。

不确定它是否有任何区别,但我使用的是Oracle SQL Developer。

4 个答案:

答案 0 :(得分:6)

您的 DATE 用法存在多个问题:

  

格式(ORDER_DATE,' DD-MMM-YYYY')=' 07-JUN-2000';

  1. FORMAT 不支持 Oracle 内置功能。<​​/ li>
  2. 永远不要将 STRING DATE 进行比较。您可能只是幸运,但是,您强制Oracle根据您的特定于语言环境的NLS设置执行隐式数据类型转换。你必须避免它。始终使用 TO_DATE 将字符串显式转换为日期。
  3. WHERE ORDER_DATE = TO_DATE('07-JUN-2000','DD-MON-YYYY','NLS_DATE_LANGUAGE=ENGLISH');
    1. 当您仅使用没有时间部分的日期处理时,请更好地使用 ANSI DATE Literal
    2. WHERE ORDER_DATE = DATE '2000-06-07';

      documentation中阅读有关DateTime文字的更多信息。

      <强>更新

      它认为添加更多有关 DATE 的信息会很有帮助。

        

      Oracle不会以您看到的格式存储日期。它存储它   内部采用7字节的专有格式,每个字节存储   日期时间值的不同组成部分。

      BYTE         Meaning
      ----         -------
      1 Century -- stored in excess-100 notation
      2 Year    --       "                "
      3 Month   -- stored in 0 base notation
      4 Day     --    "                   "
      5 Hour    -- stored in excess-1 notation
      6 Minute  --    "                   "
      7 Second  --    "                   "
      

      记住,

      To display                      : Use TO_CHAR
      Any date arithmetic/comparison  : Use TO_DATE
      

      效果瓶颈:

      我们假设您在日期列中有一个常规的 B-Tree索引。现在,由于TO_CHAR函数,以下过滤谓词永远不会使用索引:

      WHERE TO_CHAR(ORDER_DATE, 'DD-MM-YYYY') = '07-06-2000';
      

      所以,在上面的查询中使用TO_CHAR是完全没有意义的,因为它不比较日期,也没有提供良好的性能。

      正确的方法:

      进行日期比较的正确方法是:

      WHERE ORDER_DATE = TO_DATE('07-JUN-2000','DD-MON-YYYY','NLS_DATE_LANGUAGE=ENGLISH');
      

      它将使用ORDER_DATE列上的索引,因此在性能方面会更好。此外,它是比较日期而不是字符串。

      正如我已经说过的,如果你的日期中没有 time 元素,那么你可以使用 ANSI date literal ,它与NLS无关,而且代码更少

      WHERE ORDER_DATE = DATE '2000-06-07';
      

      它使用固定格式&#39; YYYY-MM-DD&#39;

答案 1 :(得分:0)

试试这个:

SELECT ORDER_NUMB, CUSTOMER_NUMB, ORDER_DATE
FROM ORDERS
WHERE trunc(to_date(ORDER_DATE, 'DD-MMM-YYYY')) = trunc(to_date('07-JUN-2000'));

答案 2 :(得分:-1)

我不认为FORMAT是一个oracle函数。

我认为你的意思是TO_CHAR

SELECT ORDER_NUMB, CUSTOMER_NUMB, ORDER_DATE
FROM ORDERS
WHERE TO_CHAR(ORDER_DATE, 'DD-MMM-YYYY') = '07-JUN-2000';

答案 3 :(得分:-2)

尝试to_char(order_date, 'DD-MON-YYYY')