oracle中星期几的比较
Posted
技术标签:
【中文标题】oracle中星期几的比较【英文标题】:Comparison between day of week in oracle 【发布时间】:2017-05-12 16:11:19 【问题描述】:我在比较星期几时遇到问题
这是我在 oracle 数据库中的查询。
SELECT DAY, WEEKDAY
FROM (SELECT v.TNI, v.FRMP, v.LR, v.DAY, v.HH, v.VOLUME,
CASE WHEN hd.HOLIDAY_DATE is not null then 'HOLIDAY'
ELSE to_char(v.DAY, 'Day') END AS WEEKDAY
FROM v_nem_rm16 v
LEFT JOIN DBP_ADMIN.DBP_HOLIDAY hd
ON v.DAY = hd.HOLIDAY_DATE
WHERE v.STATEMENT_TYPE != 'FORECAST')
WHERE WEEKDAY = 'Monday';
基本上,“WEEKDAY”列具有基于“DAY”的星期几。日期就是 17 年 3 月 13 日这样的日期 如果您查看“CASE”语句,您会注意到“WEEKDAY”列由“to_char(v.DAY, 'Day')”填充。 因此,该列具有“星期日、星期六等,星期几”之类的值。 问题在于外部查询的 where 子句“WHERE WEEKDAY = 'Monday'” 当我执行此查询时,即使我的行在“WEEKDAY”列中具有星期一作为值,它也不会给我任何行
但是当我将 WHERE 子句更改为“WHERE WEEKDAY = to_char(sysdate, 'Day')”时,它工作正常。由于“to_char(sysdate, 'Day')”给了我“星期六”,所以 sql 语句给了我在“WEEKDAY”列中有“星期六”的行。
那么我的第一个查询有什么问题?
我只想按星期几的名称过滤行,例如如果我通过“星期一”,我希望在“WEEKDAY”列中包含“星期一”的所有行。
我该怎么办??
谢谢大家
【问题讨论】:
试试to_char(v.DAY, 'fmDay')
。请注意,结果取决于当前会话 NLS_DATE_LANGUAGE
的值,该值可能随时更改。
【参考方案1】:
似乎 TO_CHAR(, 'Day') 返回一个固定长度的字符串,右侧填充空白。所以,你没有得到“星期一”,你真的得到了“星期一”。最长的一天是 'Wednesday',所以它是一个 9 个字符的字符串。因此,要么调整值,要么准确地与 'Monday' 进行比较。
select '|'||to_char(sysdate+level,'Day') ||'|' days_of_the_week
from dual
connect by level <= 7;
结果...
|Saturday |
|Sunday |
|Monday |
|Tuesday |
|Wednesday|
|Thursday |
|Friday |
【讨论】:
谢谢你是对的,我可以再问一件事吗? oracle 中的星期几有任何静态变量吗?因为我不想使用“星期一、星期二……等等”的硬编码。还是我应该明确定义? @Michael 好问题。我不知道静态常量是否存在。尝试为此创建一个新问题。同时,您也可以使用“DY”日期格式,即 3 字符的短名称,例如“MON”或“D”日期格式,即星期几(星期日 = 1),所以星期一是 '2'。 尝试'fmDay'
而不是Day
。然后结果不会用空格填充。
@WernfriedDomscheit 正确,我忘记了这一点,因为我没有亲自使用它。添加“fm”会关闭填充模式,这将消除尾随空格。【参考方案2】:
如果您想使用日期名称(全名或缩写),我建议在 to_char 函数中指定语言如下:
select '|'||to_char(sysdate+level, 'fmDay', 'NLS_DATE_LANGUAGE = American') ||'|' days_of_the_week_enu,
'|'||to_char(sysdate+level, 'fmDay', 'NLS_DATE_LANGUAGE = German') ||'|' days_of_the_week_ger,
'|'||to_char(sysdate+level, 'DY', 'NLS_DATE_LANGUAGE = American') ||'|' days_of_the_week_abbr_enu,
'|'||to_char(sysdate+level, 'DY', 'NLS_DATE_LANGUAGE = German') ||'|' days_of_the_week_abbr_ger
from dual
connect by level <= 7;
这样返回的日期名称将独立于会话区域设置。
结果:
【讨论】:
以上是关于oracle中星期几的比较的主要内容,如果未能解决你的问题,请参考以下文章
初学python算法100例-案例30 输入星期几的第一个字母判断是星期几