【问题标题】:First and Last day of the previous week with Postgresql使用 Postgresql 的前一周的第一天和最后一天
【发布时间】:2019-10-26 19:18:37
【问题描述】:

我正在尝试找到一种方法来使用 postgresql 查询前一周的第一天和最后一天。

我已经找到了 mysql 、sql server 和其他的答案,但找不到 PSQL 的答案。

我一直在尝试使用 current_date 和间隔 1 week 或 - integer '7' ( BETWEEN current_date - INTERVAL '1 weeks' and current_date ),但它只让我从当天回来 1 周,而不是前一周的第一天或最后一天。

我正在寻找动态的东西:前一周的第一天可能是星期二,最后一天是星期四,并不总是星期一和星期五,这取决于前一周存储的内容。

我需要能够检索前一周的第一天和最后一天的结果,所以我相信这将是 2 个查询。

编辑:我的主要问题是针对同一问题的大多数答案都使用 current_date / now() 并减去固定天数来检索前一周的第一天。但是查询应该是动态的,它不会在每周的同一天完成-因此根据执行查询的日期,减去的天数会有所不同-并且我在商店中的前一周的第一天是' t 总是星期一,最后一天并不总是星期五。有时我一周只有 3 天的数据,所以第一天是星期二,最后一天是星期四,我不想在星期一返回 NULL,在星期五返回 Null

编辑 2:

虚拟数据看起来像这样:

id |  date         
 1    monday(w1)      
 2    tuesday(w1)
 3    wednesday(w1)
 4    thursday(w1)
 5    friday(w1)
 6    tuesday(w2)
 7    wednesday(w2)
 8    friday(w2)
 9    monday(w3)
10    tuesday(w3)
    --query ran here--   

显然,我的日期存储为实际日期格式( 2019-10-24 ),但在查询日期(催眠星期三)我希望前一周的第一项为 id 6,最后一项为是 8 号

【问题讨论】:

  • 与您的问题无关,但是:integer '7' 可以简化为 7
  • 不是重复的。问题“如何在 PostgreSQL 中获取周开始和结束日期字符串?”使用固定的天数来检索前一周的第一天和最后一天,而我不应该这样做。因为我只能获得前一周 3 天的数据,并且第一天和最后一天会发生变化。
  • 你能给我们举个例子,前一周的第一天不是星期一吗?也许这将有助于我们更好地理解您的问题。更多示例将不胜感激!
  • @jayD - 请查看我对答案的最新更新

标签: postgresql


【解决方案1】:

根据我的阅读内容,您正在寻找一周中存储的第一天和最后一天,所以:

WITH
  first_stored AS (SELECT min(stored_date) as first FROM stored WHERE stored_date > DATE_TRUNC('WEEK', NOW()) - INTERVAL '8 DAY'),
  last_stored AS (SELECT max(stored_date) as last FROM stored WHERE stored_date < DATE_TRUNC('WEEK', NOW()) - INTERVAL '1 DAY')
SELECT first_stored.first, last_stored.last FROM first_stored, last_stored;

这会产生:

   first    |    last    
------------+------------
 2019-10-15 | 2019-10-18  -- a Tuesday and a Thursday
(1 row)

更新:

假设“今天”是2019-10-26(您对问题的最新编辑的时间戳),这里有一个与您分享的示例相符的版本:

postgres=# create table my_table (id int, stored_date date);
CREATE TABLE
postgres=# insert into my_table values (1,'2019-10-07'),(2,'2019-10-08'),(3,'2019-10-09'),(4,'2019-10-10'),(5,'2019-10-11'),(6,'2019-10-15'),(7,'2019-10-16'),(8,'2019-10-18'),(9,'2019-10-21'),(10,'2019-10-22');
INSERT 0 10
postgres=# WITH
  first_stored AS (SELECT min(stored_date) as first FROM my_table WHERE stored_date > DATE_TRUNC('WEEK', '2019-10-26'::date) - INTERVAL '8 DAY'),
  last_stored AS (SELECT max(stored_date) as last FROM my_table WHERE stored_date < DATE_TRUNC('WEEK', '2019-10-26'::date) - INTERVAL '1 DAY')
SELECT id, stored_date FROM my_table mt, first_stored fs, last_stored ls WHERE mt.stored_date in (fs.first,ls.last) ORDER BY stored_date;
 id | stored_date 
----+-------------
  6 | 2019-10-15
  8 | 2019-10-18
(2 rows)

披露:我为EnterpriseDB (EDB)工作

【讨论】:

    【解决方案2】:

    你可能想要这样的东西(见fiddle):

    SELECT DATE_TRUNC('WEEK', NOW()) - INTERVAL '8 DAY' AS first_day_of_last_week, 
           DATE_TRUNC('WEEK', NOW()) - INTERVAL '1 DAY' AS  last_day_of_last_week;
    

    结果:

    first_day_of_last_week  last_day_of_last_week
    2019-10-13 00:00:00+01  2019-10-20 00:00:00+01
    

    【讨论】:

    • 是的,这也是我的想法。问题是它只有在一周的第一天(存储)总是 7 天前才有效。有时星期一没有数据存储,所以一周的第一天是星期二,所以是 6 天前。一周的最后一天也是如此。其次,需要根据处理查询的星期几手动调整查询,我的情况是它应该每天工作。
    • 对不起 - 也许我不清楚。您想考虑相对于销售日期的一周开始时间?那么,如果一周的第一笔销售是在周二,那么这一周是从周二到下周一吗?如果下周一没有销售怎么办?也许摆弄一些示例数据和您想要的结果可能会有所帮助?
    • 如果你想有星期一,它应该是 INTERVAL '7 DAY'
    • @HWid - 更改查询 - 查看新的 fiddle - 现在处理星期日 & 星期一!感谢您指出这一点!
    猜你喜欢
    • 2017-07-21
    • 2016-07-18
    • 2021-07-21
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多