【问题标题】:Beginner way to count days between dates excluding weekends and holidays计算日期之间天数的初学者方法,不包括周末和节假日
【发布时间】:2017-06-23 21:26:51
【问题描述】:

我是 Postgres 的初学者,正在就我遇到的查询问题寻求帮助。我正在尝试计算两个日期之间的工作日数(不包括周六、周日和节假日)。这就是我想要做的事情:

Select column1, column2, (current_date - defined_date) as elapsed_days
from mytable
where elapsed_days excludes sat, sun, and holidays

【问题讨论】:

  • 您可能需要一个表格,其中包含相关时间范围内的所有假期和周末。
  • 没有简单的方法。如果你有一个假期列表,这至少是可能的。
  • 如果我跳过假期而只排除周末,有没有简单的方法?谢谢!
  • 在下面查看我的答案.. 或在您的正常查询中使用我的人口查询的“generate_series”部分,并包括“其中提取(来自 cal_date 的日期)不在 (0,6) 中的位置
  • 如果您只想排除周末,这里有很多问题 (f.ex. here) -- 如果您也想排除假期,您需要一个基于 COUNT(*) 的解决方案,其中一个表格,其中包含要排除的所需假期(可能还有 一些 个周末要包括在内,因为在某些国家/地区,还有一些额外的假期,它们只是“移动”到周末)。 PostgreSQL 没有内置的数据库/表,其中包含该数据(出于显而易见的原因)。

标签: sql postgresql count


【解决方案1】:
create table calendar c as
(cal_date date primary key,
 business_day boolean not null);


 insert into calendar
 (select 
  ('01/01/1900'::date + (g||' days')::interval)::date,
 case extract(dow from '01/01/1900'::date 
    + (g||' days')::interval) 
 when 0 then false when 6 then false else true end
 from generate_series(0,365*150) g)

现在您有一个日历表,其中周末设置为“business_day=false”,所有其他日期设置为 true。

您必须手动填充其他假期或编写一个程序来执行此操作。

之后,要计算天数之间的差异,请执行以下操作:

 select count(*) from cal 
 where cal between "start_date_var" and "end_date_var" 
 and business_day=true;

注意:如果是我,我会在您的日历表中添加一些其他列,以便它可以包括它是哪个假期,或其他类似的内容。假期甚至可能有另一张桌子。不过,这是一个好的开始。

【讨论】:

  • 不只存储假期的理由是什么?
  • 在我看来,程序员方面的逻辑较少。他们总是可以使用 extract(dow from...) 来确定工作日。有了这个,您可以索引 business_day 列并获得非常快速的结果。对我来说,它只是让你的代码更干净,但它确实为你创建了一个可以永久维护的表。我想你可以简单地插入非工作日并使用 not exists(),但是使用这种方法,它可以有更广泛的用途——标记日子,甚至是“工作日”假期等......取决于你需要什么以及您要编写多少 SQL。
  • 感谢您的帮助!在您的帮助下,我能够解决这个问题!
  • 如果这个答案是正确的,记得标记为正确答案。
猜你喜欢
  • 2020-08-21
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多