所以我在下面有这个代码,根据当天的情况,它应该返回true或false,问题是我得到null
。
显然,当我尝试输入11-08-2017
(星期三)之类的日期时,我能够按预期获得false
。然而,它在其他日子里并不起作用。
任何人都知道为什么我得到这个空的回报?
select (CASE upper(to_char(now()::timestamp without time zone,'Day'))
WHEN 'SUNDAY'
THEN ('false'::boolean)
WHEN 'MONDAY'
THEN ('false'::boolean)
WHEN 'TUESDAY'
THEN ('false'::boolean)
WHEN 'WEDNESDAY' -- works
THEN ('false'::boolean)
WHEN 'THURSDAY'
THEN ('false'::boolean)
WHEN 'FRIDAY'
THEN ('true'::boolean)
WHEN 'SATURDAY'
THEN ('false'::boolean)
END) as res;
输出:
res
(null)
PS:
此代码:select upper(to_char(now()::timestamp without time zone,'Day'))
有效且始终有输出。就在我在其中添加CASE时,它会返回null
。
答案 0 :(得分:2)
改为使用
extract(dow from current_timestamp)
- This returns 0 for Sunday, 1 for Monday,...,6 for Saturday.
不要依赖语言字符串,更好地使用数字。
进行测试:
select
*
, case extract(dow from dd)
when 5 then 'true'::boolean else 'false'::boolean
end
FROM generate_series
( '2017-11-01'::timestamp
, '2017-11-12'::timestamp
, '1 day'::interval) dd
答案 1 :(得分:1)
您的问题的直接原因似乎是在日期名称后面有尾随空格。使用trim
将表达式包装为一周中的某一天似乎可以解决问题:
select
case trim(upper(to_char(now()::timestamp without time zone,'Day')))
when 'SUNDAY'
then ('false'::boolean)
when 'MONDAY'
then ('false'::boolean)
when 'TUESDAY'
then ('false'::boolean)
when 'WEDNESDAY' -- works
then ('false'::boolean)
when 'THURSDAY'
then ('false'::boolean)
when 'FRIDAY'
then ('true'::boolean)
when 'SATURDAY'
then ('false'::boolean)
end as res;
正如@Used_By_已经提到的答案,您可能希望从日期列中提取一周的数字日,而不是走这条路线。