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

Sql 将日期转换为工作日,然后将其关联并求和,sql,postgresql,date,Sql,Postgresql,Date,查询很简单,但没有按我希望的方式运行, 我试图检查我检查的日期是否是我检查的正确日期 输入 输出 案例陈述的答案应该是1。 我加了一个较低的数字,以检查它是否与大写字母有关 理由 我之所以使用案例陈述,是因为当一个学生在周一有课外活动时,我想在表中填入1或0,然后计算周一有多少学生有课外活动的总和,依此类推 SELECT to_char(DATE '1982.03.09', 'DAY'), CASE WHEN trim(to_char(DATE '1982.03

查询很简单,但没有按我希望的方式运行, 我试图检查我检查的日期是否是我检查的正确日期

输入 输出

案例陈述的答案应该是1。 我加了一个较低的数字,以检查它是否与大写字母有关

理由 我之所以使用案例陈述,是因为当一个学生在周一有课外活动时,我想在表中填入1或0,然后计算周一有多少学生有课外活动的总和,依此类推

SELECT to_char(DATE '1982.03.09', 'DAY'),
       CASE
         WHEN trim(to_char(DATE '1982.03.09', 'DAY')) = 'TUESDAY' THEN
           1
         ELSE
           0
       END,
       CASE extract(dow FROM DATE '1982.03.09')
         WHEN 2 THEN
           1
         ELSE
           0
       END;
最终需要

我这样做是为了创建一个每周的表格,列出每天进行课外活动的儿童人数

任何关于修复我的问题的帮助都将不胜感激!
感谢

无论出于什么原因,
星期二
to_char()
生成的内容后面都有空格。您可以
trim()
。但是,与其依赖字符串表示法(当语言环境发生变化时,字符串表示法可能会发生变化),不如使用
extract()
以数字表示一周中的某一天,
0
表示周日,
1
表示周一等等

SELECT to_char(DATE '1982.03.09', 'DAY'),
       CASE
         WHEN trim(to_char(DATE '1982.03.09', 'DAY')) = 'TUESDAY' THEN
           1
         ELSE
           0
       END,
       CASE extract(dow FROM DATE '1982.03.09')
         WHEN 2 THEN
           1
         ELSE
           0
       END;

我个人喜欢用
extract(from)
代替
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
通常这对于
过滤器(其中
)来说是一个很好的用例,但是在没有活动的日期/学生记录上会留下空值。这取决于您呈现输出的方式,可能是正确的,也可能是不正确的(Excel可以很好地处理)


原因是:to_char格式掩码的宽度是固定的。因此,所有星期天的长度都是相同的。因此,“星期二”与“星期三”一样长
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