在甲骨文的星期几比较

时间:2017-05-12 16:11:19

标签: oracle date

我在比较星期几时遇到问题

这是我在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”的星期几。日就像13 / Mar / 17一样的日期 如果查看“CASE”语句,您会注意到“WEEKDAY”列填充“to_char(v.DAY,'Day')”。
所以该列的值为“星期日,星期六等,星期几”。

问题是外部查询的where子句,“WHERE WEEKDAY ='Monday'”
当我执行此查询时,即使我将星期一作为“WEEKDAY”列中的值

,它也不会给我任何行



但是当我将WHERE子句更改为“WHERE WEEKDAY = to_char(sysdate,'Day')”时,它工作正常。 sql语句给了我在“WEEKDAY”列中有“Saturday”的行,因为“to_char(sysdate,'Day')”给了我“星期六”。

那么我的第一个查询有什么问题?

我只想按星期几的名称过滤行,就像我通过“星期一”一样,我想让所有行在“WEEKDAY”栏中都有“星期一”。

我该怎么办?

感谢队员

2 个答案:

答案 0 :(得分:0)

看起来TO_CHAR(,'Day')返回一个固定长度的字符串,右边填充空格。所以,你没有得到'星期一',你真的得到'星期一'。最长的一天是'星期三',所以它是一个9个字符的字符串。因此,要么修剪该值,要么与“星期一”完全比较。

select '|'||to_char(sysdate+level,'Day') ||'|' days_of_the_week
from dual
connect by level <= 7;

结果...

|Saturday |
|Sunday   |
|Monday   |
|Tuesday  |
|Wednesday|
|Thursday |
|Friday   |

答案 1 :(得分:0)

如果您想使用日期名称(完整或缩写),我建议在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;

这样返回的日期名称将独立于会话区域设置。

结果: enter image description here