简体   繁体   English

从 Postgres 的日期范围中获取星期几

[英]Get days of the week from a date range in Postgres

So I have the following table :所以我有下表:

id     end_date      name      number_of_days    start_date
1   "2022-01-01"    holiday1        1            "2022-01-01"
2   "2022-03-20"    holiday2        1            "2022-03-20"
3   "2022-04-09"    holiday3        1            "2022-04-09"
4   "2022-05-01"    holiday4        1            "2022-05-01"
5   "2022-05-04"    holiday5        3            "2022-05-02"
6   "2022-07-12"    holiday6        9            "2022-07-20"

I want to check if a week falls in a holiday range.我想检查一周是否在假期范围内。

So far I can select the holidays that overlap with my choosen week( week_start_date, week_end_date) , but i cant get the exact days in which the overlap happens.到目前为止,我可以选择与我选择的一周重叠的假期( week_start_date,week_end_date),但我无法获得重叠发生的确切日期。

this is the query i'm using, i want to add a mechanism to detect the DAYS OF THE WEEK IN WHICH THE OVERLAP HAPPENS这是我正在使用的查询,我想添加一种机制来检测重叠发生的星期几

SELECT * FROM holidays
where daterange(CAST(start_date AS date), CAST(end_date as date), '[]') && daterange('2022-07-18', '2022-07-26','[]')

THE CURRENT QUERY RETURNS THE OVERLLAPPING HOLIDA, (id = 6), however i'm trying to get the exact DAYS OF THE WEEK in which the overlap happens ( in this case, it should be monday,tuesday , wednesday)当前查询返回重叠的 HOLIDA,(id = 6),但是我试图获得重叠发生的确切星期几(在这种情况下,应该是星期一,星期二,星期三)

You can use the * operator with tsranges , generate a series of dates with the lower and upper dates and finally with to_char print the days of the week, eg您可以将*运算符与tsranges一起使用,生成一系列具有上下日期的日期,最后使用to_char打印星期几,例如

SELECT 
  id, name, start_date, end_date, array_agg(dow) AS days
FROM (
  SELECT *,  
    trim(
      to_char(
        generate_series(lower(overlap), upper(overlap),'1 day'),
      'Day')) AS dow
  FROM holidays
  CROSS JOIN LATERAL (SELECT tsrange(start_date,end_date) * 
                             tsrange('2022-07-18', '2022-07-26')) t (overlap)
  WHERE tsrange(start_date,end_date) && tsrange('2022-07-18', '2022-07-26')) j
GROUP BY id,name,start_date,end_date,number_of_days;

 id |   name   | start_date |  end_date  |            days            
----+----------+------------+------------+----------------------------
  6 | holiday6 | 2022-07-12 | 2022-07-20 | {Monday,Tuesday,Wednesday}
(1 row)

Demo: db<>fiddle演示: db<>fiddle

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM