sql - Oracle 星期几(没有字符串比较)
问题描述
我将在前面说我发现的所有文档都不适用于我的 oracle 版本: https ://docs.oracle.com/cd/E51711_01/DR/WeekDay.html ; https://docs.oracle.com/cd/E37483_01/server.751/es_eql/src/ceql_functions_date_extract.html
或者我可以使用的功能参考不要提到星期几: https ://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm#SQLRF00639
所以我只是想办法使用to_char然后做 varchar2 比较。如果可能的话,我只想坚持日期格式。
到目前为止,这是我的 sql
select dateSold from sales
where extract(dateSold, day_of_week) in (1, 3, 4, 7)
SQL Error: ORA-00904: "DAY_OF_WEEK": invalid identifier
解决方案
您需要用于to_char()
获取日期编号,但您可以将其转换为数字:
select dateSold, sum(quantity) from sales
where to_number(to_char(dateSold, 'D')) in (1, 3, 4, 7)
但是D
它依赖于 NLS,因此如果您在美国与法国的会话中运行它,您将获得不同的结果。这可能就是您看到字符串比较的原因,因为您至少可以控制更多:
select dateSold, sum(quantity) from sales
where to_char(dateSold, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') in ('MON', 'WED', 'THU', 'SUN')
要查看 NLS 设置的不同之处,这将显示相同数据D
和DY
查询的值,就像在美国运行一样:
alter session set nls_territory = 'AMERICA';
alter session set nls_language = 'ENGLISH';
with cte (dateSold) as (
select date '2018-08-01' + level - 1 from dual connect by level <= 7
)
select dateSold,
to_number(to_char(dateSold, 'D')) as d,
to_char(dateSold, 'DY') as dy,
to_char(dateSold, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') as dy_english
from cte;
DATESOLD D DY DY_ENGLISH
--------- ---------- ------------ ------------
01-AUG-18 4 WED WED
02-AUG-18 5 THU THU
03-AUG-18 6 FRI FRI
04-AUG-18 7 SAT SAT
05-AUG-18 1 SUN SUN
06-AUG-18 2 MON MON
07-AUG-18 3 TUE TUE
然后就像在法国跑步一样:
alter session set nls_territory = 'FRANCE';
alter session set nls_language = 'FRENCH';
with cte (dateSold) as (
select date '2018-08-01' + level - 1 from dual connect by level <= 7
)
select dateSold,
to_number(to_char(dateSold, 'D')) as d,
to_char(dateSold, 'DY') as dy,
to_char(dateSold, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') as dy_english
from cte;
and the same thing as if run in the USA:
DATESOLD D DY DY_ENGLISH
-------- ---------- ---------------- ------------
01/08/18 3 MER. WED
02/08/18 4 JEU. THU
03/08/18 5 VEN. FRI
04/08/18 6 SAM. SAT
05/08/18 7 DIM. SUN
06/08/18 1 LUN. MON
07/08/18 2 MAR. TUE
请注意,日期编号和名称/缩写是完全不同的,因此尝试将它们与固定值进行比较 - 无论是in (1, 3, 4, 7)
使用字符串文字日期名称还是使用字符串文字日期名称 - 都不会可靠地匹配。
将日期语言强制为英语使比较安全。(当然,或者任何其他语言 - 字符串文字值只需与您为 . 的第三个参数选择的语言相匹配to_char()
。)
推荐阅读
- php - PHP - 通过变量动态调用对象方法
- javascript - 为什么数组字面量和 BufferArray 之间的性能差距如此之大?
- haskell - 通过条件停止迭代循环并返回与条件匹配的值
- google-apps-script - 在对象 Gmail 线程中找不到函数 removeLabel
- r - 如何对LM摘要中的系数进行排序?
- python - 将现有的 NumPy 数组转换为 ctype 数组以在多处理之间共享
- python - Python logging.info 在第二次运行脚本时创建空文本文件
- html - 截断列表项内的 x-overflow
- server - 对我服务器真实 IP 的可疑请求
- ansible - 在 Jinja2 中提取嵌套对象