我有一个带有 returned_date列的 books表。我想看看过去一周内所有返还日期的书籍的结果。
returned_date
books
- 有什么想法吗?-我试着算算日期,但是 Postgres 对我的尝试不满意。
你想使用 interval和 current_date:
interval
current_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,这是最简单和最快的:
date
SELECT * FROM books WHERE returned_date > CURRENT_DATE - 7;
now()::date是标准 SQL CURRENT_DATE 的 Postgres 实现。
now()::date
CURRENT_DATE
CURRENT_DATE - 7之所以有效,是因为可以将 integer值(= days)从/减去/加到 date。像 7这样的无引号数字被视为 数值常数,默认情况下最初转换为 integer(只有数字,加上可选的前导符号)。不需要显式转换。
CURRENT_DATE - 7
integer
7
对于数据类型 ABC0或 timestamptz,您必须添加/减去 interval,就像@Eric 演示的那样。你 可以对 date做同样的事情,但是结果是 timestamp,你必须回到 date或者继续使用 timestamp。为了达到你的目的,坚持使用 date是最简单和最快的。性能差异很小,但没有理由不接受。也不容易出错。
timestamptz
timestamp
计算与 returned_date的实际数据类型无关,操作符右侧的结果类型将被强制匹配(或者如果没有注册强制转换则引发错误)。
对于“ 过去一周”..。
到 包括今天使它成为 > current_date - 7或者 >= current_date - 6。但这通常是个坏主意,因为“今天”只是一天的一小部分,可能会产生奇怪的结果。 严格来说,>= current_date - 7返回最后一个 八天(包括今天)的行,而不是7,这是错误的。
> current_date - 7
>= current_date - 6
>= current_date - 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。参见:
BETWEEN ... AND ...
“一天”和“一周”的确切定义总是取决于您当前的 timezone设置。
timezone