我有一个books
表,其中包含returned_date
列。我希望看到过去一周发生的返回日期的所有图书的结果。
有什么想法?我试着做一些日期数学,但Postgres对我的尝试并不满意。
答案 0 :(得分:61)
您想使用interval
和current_date
:
select * from books where returned_date > current_date - interval '7 days'
这将返回过去一周的数据,包括。
Here's more处理Postgres中的日期。
答案 1 :(得分:39)
假设returned_date
实际上是数据类型 date
,这更简单,更快速,更正确:
SELECT * FROM books WHERE returned_date > CURRENT_DATE - 7
now()::date
is the Postgres implementation of standard SQL CURRENT_DATE
。两者在PostgreSQL中完全相同。
CURRENT_DATE - 7
有效,因为可以从/ date
减去/添加integer
值(=天)。像7
这样的不带引号的数字是默认为integer
的数字文字,而它只包含数字和可选的前导符号,因此不需要显式强制转换。
对于数据类型timestamp
or timestamptz
,您必须添加/减去interval
,例如@Eric演示。您可以对date
执行相同操作,但结果为timestamp
,您必须转回date
或继续使用timestamp
。坚持date
就像展示一样,是最简单,最快捷的方式。但是,性能差异通常很小。
计算独立于returned_date
的实际数据类型,操作符右侧的结果类型将被强制匹配以匹配任一方式(如果未注册强制转换则引发错误)。
对于“过去一周”:
> current_date - 7
或>= current_date - 6
。 今天排除将其设为BETWEEN current_date - 7 AND current_date - 1
(或类似)。 >= current_date - 7
因为其他答案建议返回最后 8天而不是7 的行,严格来说是错误的。
获取最后一个完整日历周,以星期日结束,排除今天:
BETWEEN date_trunc('week', now())::date - 7 AND date_trunc('week', now())::date - 1
请注意,“日期”和“周”的确切定义始终取决于您当前的timezone
设置。