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 输入星期几的第一个字母判断是星期几

使用时间跨度存储星期几的最佳方式

在java中获取日期的星期几的一个字母缩写

Python写一个根据日期计算是星期几的模块

c语言题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

基于星期几的平均值