选择两个日期之间的 COUNT 天(周末除外)

pra*_*asa 10 postgresql datetime

我试图获得两个不同日期之间的天数,周末除外。

我不知道如何达到这个结果。

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)


yie*_*ood 3

此示例枚举 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)