【问题标题】:query date ranges postgresql and excluding weekends查询日期范围 postgresql 并排除周末
【发布时间】:2023-02-08 19:38:18
【问题描述】:

我有以下 postgresql 表;

 id   |        date_slot        
------+-------------------------
 1    | [2023-02-08,2023-02-15)
 2    | [2023-02-20,2023-02-26)
 3    | [2023-02-27,2023-03-29)

我想进行查询以返回包含在这些范围内但不包括周末的行

例如,我所做的查询返回以下但不排除周末。

SELECT * FROM table where '2023-02-11'::date <@ date_slot;
 id   |        date_slot        
------+-------------------------
 1    | [2023-02-08,2023-02-15)

'2023-02-11' 是周末,因此它不得返回结果。我怎样才能做到这一点?

谢谢

【问题讨论】:

  • 试试SELECT * FROM table WHERE '2023-02-11'::date &lt;@ date_slot AND date_part('dow', '2023-02-11'::date) NOT IN (0, 6);date_part过滤周末
  • 这回答了你的问题了吗? PostgreSql: select only weekends

标签: sql postgresql date


【解决方案1】:

您可以枚举这些范围包含的日期,看看它们是否包括星期六或星期日:

SELECT * 
FROM test_table 
where '2023-02-11'::date <@ date_slot
and not exists (
  select true
  from generate_series(
          lower(date_slot)+(case when lower_inc(date_slot) then '0'::interval 
                                                           else '1'::interval end),
          upper(date_slot)-(case when upper_inc(date_slot) then '0'::interval 
                                                           else '1'::interval end),
          '1 day'::interval) as alias(d)
  where extract(isodow from d) in (6,7) );

Online demo

这也可以处理您的范围具有不同上限和下限包容性的情况。但是,有一种更简单的方法:您可以只检查范围内的第一个或最后一个日期是否在周末,以及它们之间的距离是否足以容纳一个周末。

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2018-06-01
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多