我一直在讨论查询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')
答案 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_TRUNC
和WHERE
子句的间隔中替换单位。