获取过去x周的记录

时间:2017-08-30 14:08:11

标签: sql postgresql date conditional-statements

我一直在讨论查询created_at在当前或过去x周内的记录的问题。比如,今天是星期三,所以如果x = 1,那么从周一到午夜,直到现在,如果x> 1。 1,我正在寻找当前周,直到今天,或过去一周,但没有使用常规interval '1 week',因为周三到周三会得到我,我只是在调查"整个"周。

我已尝试过区间解决方案,还有WHERE created_at > (CURRENT_DATE - INTERVAL '5 week')之类的问题。 一个适用于日,月,年等的解决方案将是首选,因为我实际上是通过其他一些后端逻辑构建查询。

我正在寻找&#34的通用查询;查找已创建的所有内容' x句点'回来。

编辑:

自上次以来,我在Ruby on Rails应用程序中实现了这一点。这在使用HOUR时引起了一些问题。除了小时(月,日和年)之外,内置版适用于所有内容

SELECT "customer_uses".* 
FROM "customer_uses" 
WHERE (customer_uses.created_at > DATE_TRUNC('MONTH', TIMESTAMP '2017-09-17T16:45:01+02:00') - INTERVAL '1 MONTH')

在我的测试用例中正常工作。 (检查计数)。 TIMESTAMP由DateTime.now生成,以确保我的测试用例使用时间覆盖来进行时间旅行" -tests,因此不使用内置函数。

(我已经剥去了一些额外的WHERE电话,这些电话应该是无关紧要的。)

为什么HOUR不起作用对我来说是一个谜,因为我使用HOUR而不是MONTH的插值字符串,如上所述:

SELECT "customer_uses".* 
FROM "customer_uses" 
WHERE (customer_uses.created_at > DATE_TRUNC('HOUR', TIMESTAMP '2017-09-17T16:45:21+02:00') - INTERVAL '1 HOUR')

1 个答案:

答案 0 :(得分:1)

您当前建议的查询几乎是正确的,除了它使用当前日期而不是一周的开头:

SELECT * FROM your_table WHERE created_at > (CURRENT_DATE - INTERVAL '5 week')

相反,我们可以向后检查5周的间隔,但是从当周开始:

SELECT *
FROM your_table
WHERE created_at > DATE_TRUNC('week', CURRENT_DATE) - INTERVAL '5 week';

我相信您应该可以将上述查询用作其他时间段的模板,例如:一定数月。只需在DATE_TRUNCWHERE子句的间隔中替换单位。