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