获取表格中排除日期范围后的剩余天数
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
以获得最佳效果。见:
另外:不要使用 reserved words start
和 end
作为标识符。
相关:
Select rows which are not present in other table【讨论】:
我不想硬编码这些值。因为这是测试数据。我必须对许多记录使用此查询 @user10449251 所以定义你想要的。以上是关于获取表格中排除日期范围后的剩余天数的主要内容,如果未能解决你的问题,请参考以下文章