如何创建一个 table 包含给定年份中已知日期 7 天范围内的所有日期(来自单独的 table)

How to create a table containing all dates in a given year that are within a 7-day range of known dates (from a separate table)

我有一个 table(假期)包含一年中的所有假期:

我需要创建一个 table (t1),其中 1 列包含一年中的所有 365 天,另一列 'description' 包含所有日期的假期名称假期的 +/- 7 天范围,并且 'None' 对于超出此范围的所有日期。

我能够使用 generate_series 创建第一列(my_date:一年内所有 365 天)并使用左连接尝试创建第二列(说明)

WITH all_dates AS
    SELECT my_date::date
    FROM generate_series('2020-01-01', '2020-12-31', '1 day'::interval) my_date)
 
SELECT  all_dates.my_date,
        holidays.description
FROM all_dates
LEFT JOIN holidays
        ON all_dates.my_date = holidays.holiday_date

创建下面的table。

但是,我需要将 2020-01-02、2020-01-02、...、2020-01-08 描述为“元旦”,因为这些日期在元旦的 7 天范围,其他假期 7 天范围内的其他日子等等(例如,2020-12-18 到 2020-12-31 之间日期的行将具有描述 'Christmas')

我也不确定如何处理超过一个假期的 7 天范围内的日子(父亲节和独立日有重叠的日期在 7 天范围内)。我需要它在 2020 年每天只有一行。

如有任何帮助,我们将不胜感激!

试试下面的方法。您已经有了假期周围的范围,所以在连接中使用它。然后,使用 distinct on 将每个日历日期的结果限制为一个,并调整 order by 以保留您想要的假期。

with all_dates as (
  select my_date::date
    from generate_series('2020-01-01', 
                         '2020-12-31', '1 day'::interval) my_date
)
select distinct on (all_dates.my_date) 
       all_dates.my_date,
       holidays.description
  from all_dates
       left join holidays
         on all_dates.my_date 
              between holidays.holiday_date_min7
                  and holidays.holiday_date_plus7
 order by all_dates.my_date, 
          abs(all_dates.my_date - holidays.holiday_date), -- keep closest
          all_dates.my_date - holidays.holiday_date -- prefer upcoming holiday