首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在postgreSQL中,有没有办法把节假日和工作日分开?

在postgreSQL中,有没有办法把节假日和工作日分开?
EN

Stack Overflow用户
提问于 2019-01-19 19:17:21
回答 1查看 107关注 0票数 2

我住在伊朗,伊朗的假日和日历不一样。我需要把周末和工作日隔开。我的日程表上有伊朗假日。我的表是这样的:

代码语言:javascript
运行
复制
start_date           finish_date         datediff(day)
---------------------------------------------------
03/03/2018           03/09/2018          6
03/10/2018           03/21/2018          11

我知道伊朗的节日包括以下几天:

代码语言:javascript
运行
复制
03/05/2018
03/11/2018
03/19/2018

所以我需要从任何时间间隔减少伊朗的假期。例如,时间03/05/2018在第一个时间间隔内,应该从这个时间间隔中减少。关键是我不能连接假日表和时间间隔表,因为它们在两个不同的数据库上。

最终的表格是这样的:

代码语言:javascript
运行
复制
start_date           finish_date         datediff(day)   Difference_of_time_ 
                                                         except_the_holidays
---------------------------------------------------------------------------
03/03/2018           03/09/2018          6                       5
03/10/2018           03/21/2018          11                      9
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-20 07:50:51

在我之前的两个公司里,我已经解决了这个问题。在每种情况下,一个非常有效的解决方案是维护一个包含所有天的工作日日历:工作日、周末、节假日,并对每一天进行分类。它还具有一个运行索引,用于指示某个工作日是否已过。下面是一个示例:

代码语言:javascript
运行
复制
cal_date   is_workday  day_type     workday_index   workday_index_back
  7/1/2018 0           WE                    4635                 4635
  7/2/2018 1           WD                    4636                 4635
  7/3/2018 1           WD                    4637                 4636
  7/4/2018 0           HD                    4637                 4637
  7/5/2018 1           WD                    4638                 4637
  7/6/2018 1           WD                    4639                 4638
  7/7/2018 0           WE                    4639                 4639
  7/8/2018 0           WE                    4639                 4639
  7/9/2018 1           WD                    4640                 4639
 7/10/2018 1           WD                    4641                 4640
 7/11/2018 1           WD                    4642                 4641
 7/12/2018 1           WD                    4643                 4642
 7/13/2018 1           WD                    4644                 4643
 7/14/2018 0           WE                    4644                 4644
 7/15/2018 0           WE                    4644                 4644

(7月4日是美国的假日)。

workday_index字段在每个工作日都会递增,在非工作日不会递增。正如您可以想象的那样,一旦定义了假期日历,这个表就很容易构建。

这些数字本身没有任何意义--它们只是一种根据整个日历计算工作天数的机制。

从这里开始,计算终止日期之间的差异就像下面这样简单:

代码语言:javascript
运行
复制
select
  t.start_date, t.finish_date,
  t.finish_date - t.start_date as calendar_days,
  wd2.workday_index - wd1.workday_index as work_days
from
  table t
  join work_days wd1 on t.start_date = wd1.cal_date
  join work_days wd2 on t.finish_date = wd2.cal_date

你也可以做一些事情,比如计算某物的工作天数。例如,如果您具有客户需求日期和提前期(制造天数),则可以按以下方式计算最迟可能的起始日期:

代码语言:javascript
运行
复制
select
  c.need_date, c.lead_time_days, 
  wd2.cal_date as earliest_possible_start_date
from
  customer_data c
  join util.work_days wd1 on c.need_date = wd1.cal_date
  join util.work_days wd2 on wd1.workday_index - c.lead_time_days = wd2.workday_index

另外,如果您想应用前滚和回滚规则,那么该表的工作方式也不同--这就是为什么有两个workday索引--向前和向后。这是适用的,因为您处理非工作日的方式可能与上下文相关。

例如,如果客户想要在星期六之前获得产品--那么他的需求日期实际上是星期五(回滚)。然而,如果你在周六有一个供应商的承诺交付,那么日期需要向前推--你直到周一才能真正得到它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54266513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档