获取表格中排除日期范围后的剩余天数

Posted

技术标签:

【中文标题】获取表格中排除日期范围后的剩余天数【英文标题】:Get the number of remaining days after excluding date ranges in a table 【发布时间】:2019-12-04 23:56:36 【问题描述】:
create table test (start date ,"end" date);

insert into test values 
      ('2019-05-05','2019-05-10')
     ,('2019-05-25','2019-06-10')
     ,('2019-07-05','2019-07-10')
     ;

我正在寻找以下输出,其中对于开始和结束之间的每个日期,该人仅在开始和结束之间可用。考虑到 5 月他在场 11 天(05/05 到 05/10 和 05/25 到 05/31),并且 5 月的总天数是 31。输出列应该有 31- 11(他工作的天数)

MonthDate------Days-

2019-05-01   20(31-11)
2019-06-01   20(30-10)
2019-07-01   26(31-5)

【问题讨论】:

到目前为止你有什么尝试? 我不相信你的结果。例如,您的描述在 5 月有 18 天的空闲时间。 您必须决定是否包括或排除范围的上限 - 始终如一。 【参考方案1】:

我得到的结果略有不同。

但我们的想法是生成每个日期。然后过滤掉使用过的并聚合:

select date_trunc('month', dte) as yyyymm,
       count(*) filter (where t.startd is null) as available_days
from (select generate_series(date_trunc('month', min(startd)), date_trunc('month', max(endd)) + interval '1 month - 1 day', interval '1 day') dte
      from test
     ) d left join
     test t
     on d.dte between t.startd and t.endd
group by date_trunc('month', dte)
order by date_trunc('month', dte);

Here 是一个 dbfiddle。

五月的空闲天数是:

1
2
3
4
11

12
13
14
15
16

17
18
19
20
21

22
23
24

我数了其中的 18 个。所以,我相信这个查询的结果。

如果您不想包含结束日期(这与您使用“介于”的描述相反,那么on 逻辑将是:

 on d.dte >= t.startd and 
    d.dte < t.endd

但这只会让你在 5 月达到 19 岁。

【讨论】:

【参考方案2】:

您的结果不一致。我决定使用 inclusive 边界以获得最简单的解决方案:

SELECT date_trunc('month', d)::date, count(*)
FROM (
   SELECT generate_series(timestamp '2019-05-01', timestamp '2019-07-31', interval '1 day') d
   EXCEPT ALL
   SELECT generate_series(start_date::timestamp, end_date::timestamp, interval '1 day') x
   FROM   test
   ) sub
GROUP  BY date_trunc('month', d);
日期截断 |数数 ------------+------ 2019-05-01 | 18 2019-06-01 | 20 2019-07-01 | 25

db小提琴here

这会生成给定时间范围内的所有天数(在您的情况下为一年中的 5 月至 7 月),并且不包括从您的所有日期范围生成的天数。

假设至少 Postgres 10。

What is the expected behaviour for multiple set-returning functions in SELECT clause?

假设您的表中有数据类型date。我投给timestamp以获得最佳效果。见:

Generating time series between two dates in PostgreSQL

另外:不要使用 reserved words startend 作为标识符。

相关:

Select rows which are not present in other table

【讨论】:

我不想硬编码这些值。因为这是测试数据。我必须对许多记录使用此查询 @user10449251 所以定义你想要的。

以上是关于获取表格中排除日期范围后的剩余天数的主要内容,如果未能解决你的问题,请参考以下文章

新手求教Java时间转换问题(增加天数后的日期输出)

excel表格怎么算日期天数

excel中怎样自动计算当月天数?

excel表格日期计算天数

如果我们有很多任务并且每个任务的日期范围可能重叠,如何计算任务的工作天数

android里 怎么计算日期差