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

时间:2012-01-04 19:08:27

标签: sql postgresql date-arithmetic

我有一个books表,其中包含returned_date列。我希望看到过去一周发生的返回日期的所有图书的结果。

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

2 个答案:

答案 0 :(得分:61)

您想使用intervalcurrent_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设置。