Huu*_*uze 43 sql postgresql date-arithmetic
我有一个books
带有returned_date
列的表.我希望看到过去一周发生的所有图书的结果.
有什么想法吗?我尝试做一些日期数学,但Postgres对我的尝试并不满意.
Eri*_*ric 69
你想使用interval
和current_date
:
select * from books where returned_date > current_date - interval '7 days'
Run Code Online (Sandbox Code Playgroud)
这将返回过去一周的数据,包括今天的数据.
这里有更多关于在Postgres中使用日期的信息.
Erw*_*ter 42
假设returned_date
实际上是数据类型date
,这更简单,更快速和正确:
SELECT * FROM books WHERE returned_date > CURRENT_DATE - 7
Run Code Online (Sandbox Code Playgroud)
now()::date
是标准SQL的Postgres实现CURRENT_DATE
.两者在PostgreSQL中完全相同.
CURRENT_DATE - 7
因为人们可以从/减去/添加integer
值(=天)date
.一个不带引号的数字就像7
是一个数字文字的默认值,integer
虽然它只包含数字和一个可选的前导符号,所以不需要显式强制转换.
使用数据类型timestamp
或者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
设置.
归档时间: |
|
查看次数: |
28880 次 |
最近记录: |