查询很简单,但无法按照我想要的方式运行, 我正在尝试检查检查的日期是我检查的正确日期。
SELECT TO_CHAR(date '1982.03.09', 'DAY'),
(CASE When lower(TO_CHAR(date '1982.03.09', 'DAY')) like lower('TUESDAY')
then 1 else 0 end)
对于case语句,答案应该为1。 我加了一点,以检查是否有大写字母
我之所以要使用案例陈述,是因为当一个学生在星期一进行课外活动时,我想在表中放置1或0,并计算出星期一有多少学生进行课余活动的总和,依此类推。
我这样做是为了创建一个每周的表格,其中包含每天进行课余活动的孩子人数。
任何有关解决我的查询的帮助将不胜感激! 谢谢
答案 0 :(得分:2)
无论出于何种原因,TUESDAY
to_char()
产生的后面都有空格。您可以trim()
将它们移开。但是,最好不要使用字符串表示形式(当语言环境更改时可能会改变),您最好使用extract()
以数字表示形式获取星期几,0
代表星期日,{{1} },以此类推。
1
答案 1 :(得分:1)
对于这样的问题,我是extract (<datepart> from <date>)
的个人粉丝,而不是to_char
。
根据您要实现的输出,我可能还会推荐一个穷人的数据透视表:
select
student_id,
max (case when extract (dow from activity_date) = 1 then 1 else 0 end) as mo,
max (case when extract (dow from activity_date) = 2 then 1 else 0 end) as tu,
max (case when extract (dow from activity_date) = 3 then 1 else 0 end) as we,
max (case when extract (dow from activity_date) = 4 then 1 else 0 end) as th,
max (case when extract (dow from activity_date) = 5 then 1 else 0 end) as fr
from activities
where activity_date between :FROM_DATE and :THRU_DATE
group by
student_id
通常,这对于filter (where
是一个很好的用例,但是在没有活动的日期/学生记录上会留下空值。根据您呈现输出的方式,可能会也可能不会(Excel会很好地处理)。
select
student_id,
max (1) filter (where extract (dow from activity_date) = 1) as mo,
max (1) filter (where extract (dow from activity_date) = 2) as tu,
max (1) filter (where extract (dow from activity_date) = 3) as we,
max (1) filter (where extract (dow from activity_date) = 4) as th,
max (1) filter (where extract (dow from activity_date) = 5) as fr
from activities
group by
student_id