将日期转换为工作日,然后将其关联并求和

时间:2019-01-29 11:04:04

标签: sql postgresql date

查询很简单,但无法按照我想要的方式运行, 我正在尝试检查检查的日期是我检查的正确日期。

输入

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)

输出

enter image description here

对于case语句,答案应该为1。 我加了一点,以检查是否有大写字母

原因

我之所以要使用案例陈述,是因为当一个学生在星期一进行课外活动时,我想在表中放置1或0,并计算出星期一有多少学生进行课余活动的总和,依此类推。

最终需要

enter image description here

我这样做是为了创建一个每周的表格,其中包含每天进行课余活动的孩子人数。

任何有关解决我的查询的帮助将不胜感激! 谢谢

2 个答案:

答案 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