繁体   English   中英

如何在 Postgres SQL 中找到在整月/季度前创建的用户?

[英]How do I find users created exactly multiple whole months/quarters ago in Postgres SQL?

我如何在 Postgres SQL 中找到整几个月/几个季度前创建的所有用户记录? 是否可以?

在 Postgres 中,您可以找到距离日期时间字段正好 1 个月的日期,例如:

select created_at + interval '1 month' from users limit 1;
?column?          
----------------------------
2016-10-05 17:05:14.811537
(1 row)

如果今天是 9/27/2016,我想查找在 8/27/2016、7/27/2016、6/27/2016、... 1/27/2015 等创建的所有用户记录。我如何在 SQL 中执行此操作?

请注意,这不仅仅是日期的比较,因为有些月份有 31 天,而其他月份有 28、29、30 天。

如果今天是 2/28/2015(非闰年),我希望所有在以下日期创建的用户:1/28/2015、1/29/2015、1/30/2015、1/31/2015, 12/28/2014、12/29/2014、12/30/2014、12/31/2014等

如果今天是 2/28/2016(闰年),我希望在以下日期创建所有用户:1/28/2015、12/28/2014、11/28/2014 等(但不是在 1 /29/2015、1/30/2015、1/31/2015,因为这些用户将在第二天被接走,见下文)。

如果今天是 2/29/2016(闰年),我希望所有在以下日期创建的用户:1/29/2015、1/30/2015、1/31/2015、12/29/2014、12/ 30/2014、12/31/2014 等

如果今天是 3/31/2016,我想要在 12/31/2015、1/31/2016 创建的所有用户,但不希望在 2016 年 2 月创建的任何用户,因为他们会在 2016 年 3 月的前几天被选中。

我如何用季度而不是月来做上述事情?

与此相关的另一个问题是性能。 如果我在created_at上创建索引,如果我执行这种类型的查询,是否可以避免整个表扫描?

谢谢你。

嗯...如果你想想,你想比较现实中的天数,对吧? 所以你应该这样做:

select 
    * 
from 
    users 
where 
    date_part('day', created_at) = date_part('day', current_timestamp) 
    OR
    (
    -- Check if this is the last day of month
        extract(month from current_timestamp + '1day'::interval) <> extract(month from current_timestamp)
        AND 
        date_part('day', created_at) > date_part('day', current_timestamp) 
    )
limit 
    1
;

关于你的索引问题 - 是的。

这里获取的检查一个月最后一天的灵感。

基本上,如果我仍然没有得到您的要求,如果您理解它,您应该能够轻松修改我的代码以满足它。 :)

暂无
暂无

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

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