我遇到了一些问题,我认为这是一个简单的问题,但谷歌搜索并没有帮助很大的负担。可能我对我正在寻找的东西不好了。
SELECT ORDER_NUMB, CUSTOMER_NUMB, ORDER_DATE
FROM ORDERS
WHERE FORMAT(ORDER_DATE, 'DD-MMM-YYYY') = '07-JUN-2000';
它告诉我我使用的是无效的标识符。我尝试使用MON
代替MMM
,但这也无济于事。
不确定它是否有任何区别,但我使用的是Oracle SQL Developer。
答案 0 :(得分:6)
您的 DATE 用法存在多个问题:
格式(ORDER_DATE,' DD-MMM-YYYY')=' 07-JUN-2000';
WHERE ORDER_DATE = TO_DATE('07-JUN-2000','DD-MON-YYYY','NLS_DATE_LANGUAGE=ENGLISH');
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')