你如何找到过去一周发生的结果?

Huu*_*uze 43 sql postgresql date-arithmetic

我有一个books带有returned_date列的表.我希望看到过去一周发生的所有图书的结果.

有什么想法吗?我尝试做一些日期数学,但Postgres对我的尝试并不满意.

Eri*_*ric 69

你想使用intervalcurrent_date:

select * from books where returned_date > current_date - interval '7 days'
Run Code Online (Sandbox Code Playgroud)

这将返回过去一周的数据,包括今天的数据.

这里有更多关于在Postgres中使用日期的信息.

  • 这实际上检索了8天,包括当天,而不是7天. (5认同)

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设置.