Erw*_*ter 15
假设“周末”是指星期六和星期日,这可以更简单:
SELECT count(*) AS count_days_no_weekend
FROM generate_series(timestamp '2014-01-01'
, timestamp '2014-01-10'
, interval '1 day') the_day
WHERE extract('ISODOW' FROM the_day) < 6;
Run Code Online (Sandbox Code Playgroud)
您不需要额外的子查询级别generate_series()
。SRF(设置返回函数),也称为“表函数”,可以像FROM
子句中的表一样使用。
特别注意,只要完整间隔(第三个参数)适合,就generate_series()
包括输出中的上限。仅当最后一个时间间隔被截断时才排除上限,而全天情况并非如此。
根据 ISO 标准,对于 EXTRACT()的模式ISODOW
,星期日被报告为7
。允许更简单的WHERE
条件。
而是generate_series()
通过timestamp
输入调用。原因如下:
count(*)
比 略短和快count(the_day)
,在这种情况下做同样的事情。
要排除下限和/或上限,请相应地加/减 1 天。通常,您可能包括下限并排除上限:
SELECT count(*) AS count_days_no_weekend
FROM generate_series(timestamp '2014-01-01'
, timestamp '2014-01-10' - interval '1 day'
, interval '1 day') the_day
WHERE extract('ISODOW' FROM the_day) < 6;
Run Code Online (Sandbox Code Playgroud)
此示例枚举 2013-12-15 和 2014-01-02(含)之间的所有日期。第二列给出星期几(数字形式,介于 0 和 6 之间)。第三列标记一周中的某一天是否是周六/周日(您必须调整您认为的周末),并且可用于计算工作日。
select '2013-12-15'::date + i * interval '1 day',
extract('dow' from '2013-12-15'::date + i * interval '1 day') as dow,
case when extract('dow' from '2013-12-15'::date + i * interval '1 day') in (0, 6)
then false
else true end as is_weekday
from generate_series(0, '2014-01-02'::date - '2013-12-15'::date) i
;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38131 次 |
最近记录: |