迭代PostgreSQL中的日期集

问题描述 投票:0回答:1

目前,我正在使用PostgreSQL实现数据库。我有以下数据库(希望ER图完全描述它)enter image description here

关于数据库,您需要知道的是,朋友可以休息一下,并有一个假期,假期由holidayidstart_dateend_date表中显示。

我想创建一个PostgreSQL查询,该查询将查找恰好N个朋友放假的日期。我对在开始日期和结束日期之间的时间段内进行迭代感到困惑。(可以使用此查询的所有解决方案都可以)。

示例:假设holiday表具有这样的内容

(1, '2012-05-23', '2012-05-27', 1)
(2, '2012-05-23', '2012-05-24', 2)
(3, '2012-05-24', '2012-05-26', 3)

假设friend表包含这三个朋友。

number of friends = 3的输出将为'2012-05-24'。

对于number of friends = 2将为('2012-05-23','2012-05-25','2012-05-26')。

sql-server postgresql datetime
1个回答
1
投票

您可以使用GENERATE_SERIES生成最早的GENERATE_SERIES和最新的start_date之间的所有日期的列表,然后从end_date生成到LEFT JOIN,以查找在给定假期中所有休假的朋友日期。然后,您可以对它们进行计数并根据结果进行过滤。例如,要查找2个朋友度假的日子:

holiday

输出:

SELECT dates.d AS "date", COUNT(*) AS num_on_holiday
FROM GENERATE_SERIES((SELECT MIN(start_date) FROM holiday),
                     (SELECT MAX(end_date) FROM holiday),
                     '1 day'::interval) dates(d)
LEFT JOIN holiday h ON dates.d BETWEEN h.start_date AND h.end_date
GROUP BY dates.d
HAVING COUNT(*) = 2
ORDER BY dates.d

date num_on_holiday 2012-05-23 00:00:00+01 2 2012-05-25 00:00:00+01 2 2012-05-26 00:00:00+01 2

© www.soinside.com 2019 - 2024. All rights reserved.