如何比较 Oracle 中的日期?

How to compare date in Oracle?

我遇到了问题,我认为这是一个简单的问题,但谷歌搜索并没有帮助很大的负载。可能我对搜索的东西不太了解。

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

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

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

我无法将 FORMAT 识别为 oracle 函数。

我想你的意思是 TO_CHAR

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

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

有多个问题与您的 DATE 用法相关:

WHERE FORMAT(ORDER_DATE, 'DD-MMM-YYYY') = '07-JUN-2000';

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

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


更新

我认为添加更多关于 DATE 的信息会有所帮助。

Oracle does not store dates in the format you see. It stores it internally in a proprietary format in 7 bytes with each byte storing different components of the datetime value.

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 树索引。现在,由于 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';

使用固定格式'YYYY-MM-DD'.

试试这个:

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