你如何找到上周发生的结果?

我有一个带有 returned_date列的 books表。我想看看过去一周内所有返还日期的书籍的结果。

- 有什么想法吗?-我试着算算日期,但是 Postgres 对我的尝试不满意。

62496 次浏览

你想使用 intervalcurrent_date:

select * from books where returned_date > current_date - interval '7 days'

这将返回上周 包括今天的数据。

这里有更多关于在 Postgres 约会的信息。

你试了什么数学?

这个应该可以

select * from books where current_date - integer '7'

取自 PostgreSQL 日期/时间函数和运算符

假设 returned_date是数据类型 date,这是最简单和最快的:

SELECT * FROM books WHERE returned_date > CURRENT_DATE - 7;

now()::date是标准 SQL CURRENT_DATE 的 Postgres 实现。

CURRENT_DATE - 7之所以有效,是因为可以将 integer值(= days)从/减去/加到 date。像 7这样的无引号数字被视为 数值常数,默认情况下最初转换为 integer(只有数字,加上可选的前导符号)。不需要显式转换。

对于数据类型 ABC0或 timestamptz,您必须添加/减去 interval,就像@Eric 演示的那样。你 可以date做同样的事情,但是结果是 timestamp,你必须回到 date或者继续使用 timestamp。为了达到你的目的,坚持使用 date是最简单和最快的。性能差异很小,但没有理由不接受。也不容易出错。

计算与 returned_date的实际数据类型无关,操作符右侧的结果类型将被强制匹配(或者如果没有注册强制转换则引发错误)。

对于“ 过去一周”..。

包括今天使它成为 > current_date - 7或者 >= current_date - 6。但这通常是个坏主意,因为“今天”只是一天的一小部分,可能会产生奇怪的结果。
严格来说,>= current_date - 7返回最后一个 八天(包括今天)的行,而不是7,这是错误的。

不包括今天制作:

WHERE returned_date >= current_date - 7
AND   returned_date <  current_date

或者:

WHERE returned_date BETWEEN current_date - 7
AND     current_date - 1

最后一个完整的 日历周在周日结束,不包括今天:

WHERE returned_date BETWEEN date_trunc('week', now())::date - 7
AND     date_trunc('week', now())::date - 1

BETWEEN ... AND ...适用于数据类型 date(作为一种离散类型) ,但通常不适用于 timestamp/timestamptz。参见:

“一天”和“一周”的确切定义总是取决于您当前的 timezone设置。