我在比较星期几时遇到问题
这是我在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”栏中都有“星期一”。
我该怎么办?
感谢队员
答案 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;
这样返回的日期名称将独立于会话区域设置。