我遇到了一个问题,本以为很简单,但是搜索引擎没有提供有效的帮助。可能是我不太擅长搜索相关信息。
SELECT ORDER_NUMB, CUSTOMER_NUMB, ORDER_DATE
FROM ORDERS
WHERE FORMAT(ORDER_DATE, 'DD-MMM-YYYY') = '07-JUN-2000';
它告诉我使用了无效的标识符。我已经尝试使用MON
代替MMM
,但这并没有帮助。
不确定是否有任何区别,但我正在使用Oracle SQL Developer。
我遇到了一个问题,本以为很简单,但是搜索引擎没有提供有效的帮助。可能是我不太擅长搜索相关信息。
SELECT ORDER_NUMB, CUSTOMER_NUMB, ORDER_DATE
FROM ORDERS
WHERE FORMAT(ORDER_DATE, 'DD-MMM-YYYY') = '07-JUN-2000';
它告诉我使用了无效的标识符。我已经尝试使用MON
代替MMM
,但这并没有帮助。
不确定是否有任何区别,但我正在使用Oracle SQL Developer。
与您的日期使用有多个问题:
WHERE FORMAT(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';
在文档中了解更多DateTime文字的信息。
更新
我认为添加一些关于日期的信息可能会有所帮助。
Oracle不会以您看到的格式存储日期。它在7个字节中以专有格式内部存储,每个字节存储datetime值的不同组件。
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列上的索引,因此在性能方面会更好。此外,它正在比较日期而不是字符串。
如我所说,如果您的日期中没有时间元素,则可以使用ANSI日期文字,它是NLS独立的,并且编码较少。
WHERE ORDER_DATE = DATE '2000-06-07';
它使用固定格式'YYYY-MM-DD'。
TO_CHAR(dateField, '...dateFormat...') = 'dateString'
中,隐式转换发生在哪里?你在这里比较了两个字符串。 - VeverkeWHERE ORDER_DATE = TO_DATE('07-JUN-2000','DD-MON-YYYY','NLS_DATE_LANGUAGE=ENGLISH');
将使用 ORDER_DATE 列上的常规索引。因此,在性能方面也要好得多。 - Lalit Kumar B试试这个:
SELECT ORDER_NUMB, CUSTOMER_NUMB, ORDER_DATE
FROM ORDERS
WHERE trunc(to_date(ORDER_DATE, 'DD-MMM-YYYY')) = trunc(to_date('07-JUN-2000'));
我不认识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(dateField, '...dateFormat...') = 'dateString'
中,隐式转换发生在哪里?你在这里比较了两个字符串。 - Veverke尝试使用to_char(order_date, 'DD-MON-YYYY')
to_date
而不是在列中使用 to_char
。 - Stawrosto_char(order_date, 'DD-MM-YYYY') = '07-06-2000'
,以便独立于会话NLS_DATE_LANGUAGE
。 - Wernfried Domscheitto_char(mydate, 'yyyymm') = '201510'
)。但是,Wernfried的评论很重要:在处理月份名称时应指定日期语言。因此,这是正确的答案,只是可以更好些 :-) - Thorsten Kettner
WHERE ORDER_DATE = '2000-06-07'
呢? - Siyualwhere order_date = to_date('07/06/2000', 'dd/mm/yyyy')
。这假定订单日期列中没有存储任何时间元素(即所有存储都在午夜时刻)。 - Boneistformat()
函数? - user330315'2000-06-07'
是一个字符串,而不是日期。你的左侧是正确的,但是你必须在右侧使用 TO_DATE 或 ANSI 日期字面量。 - Lalit Kumar B