Postgresql 使用postgresSQL(红移)仅查询日期范围内的记录

Postgresql 使用postgresSQL(红移)仅查询日期范围内的记录,postgresql,amazon-redshift,Postgresql,Amazon Redshift,我正在努力抓取从今天到14周前的所有记录。我也需要一年前的那个星期。我有以下资料: WHERE date(date) >= date(dateadd(week,-14, current_date)) OR date(date) >= date(dateadd(week,-52, current_date)) OR date(date) <= date(dateadd(week,-53, current_date)) WHERE date(date)>=date(dateadd

我正在努力抓取从今天到14周前的所有记录。我也需要一年前的那个星期。我有以下资料:

WHERE date(date) >= date(dateadd(week,-14, current_date))
OR date(date) >= date(dateadd(week,-52, current_date))
OR date(date) <= date(dateadd(week,-53, current_date))
WHERE date(date)>=date(dateadd(第-14周,当前_日期))
或日期(date)>=日期(dateadd(第-52周,当前_日期))

或者date(date)你可以研究如何使用
INTERVAL
GETDATE()
中减去-
date(日期)
——这可能会使事情更容易阅读/推理,但是
DATEADD
在理论上应该是可行的(虽然它不是标准的Postgres--
INTERVAL
是)

与您的代码相比,您所陈述的需求中有一点非常突出,即从布尔逻辑的角度来看,编写的代码与您的需求不匹配

你说你需要从今天到14周前的所有记录,和一年前同一周的记录

你的代码是:给我所有记录,其中日期在过去14周内,日期大于52周前日期小于53周前

从纯布尔的角度来看,您想要的更像这样:

WHERE date(date) >= date(dateadd(week,-14, current_date))
   OR (date(date) >= date(dateadd(week,-52, current_date))
       AND date(date) <= date(dateadd(week,-53, current_date))
      )

这就是我的意思,当使用
间隔时,对逻辑进行推理可能更容易——使用这些大的负偏移量,虽然它们肯定可以工作,但在我看来,它们的推理并不那么直观。也可能值得切换内部
的两面,因此
-53
,前面的值位于左侧(不会更改功能,但可能会使
DATEADD
的使用更容易在此代码中进行推理)。

亚马逊红移基于PostgreSQL 8.0。它不支持“interval”数据类型,但文档称它支持interval算法。我没有看到任何关于它支持
dateadd()
的提示,但我可能错过了它

此查询将在当前版本的PostgreSQL和SQLFIDLE上进行测试和验证。我认为它不会像红移上写的那样工作,但对你来说重要的部分就是WHERE子句。常用的表表达式只是给我们一个日历来进行区间运算。红移时你不需要它

不清楚你所说的“同一周,但一年前”是什么意思。你没有提到任何特定的一周;你似乎对14周的周期感兴趣。此查询从中返回行

  • 2014-09-23(14周前)至2014-12-30(当前日期),以及
  • 2013年的同一日期

    with calendar as (
     select (generate_series((current_date - interval '18 months'), current_date, '1 day'))::date cal_date
    )
    select cal_date
    from calendar
    where cal_date between (current_date - interval '14 weeks')::date 
                       and current_date
       or cal_date between ((current_date - interval '1 year')::date - interval '14 weeks')::date 
                       and (current_date - interval '1 year')::date 
    order by cal_date;
    
校准日期 -- 2013-09-23 ... 2013-12-30 2014-09-23 ... 2014-12-30 “似乎工作不正常”是什么意思?你收到错误信息了吗?弄错行了吗?PostgreSQL本机不支持非标准日期函数,如
dateadd()
。红移吗?“同一周但一年前”是什么意思?相同的日历日,一年中相同的周数,相同的ISO周,还有别的吗?
with calendar as (
 select (generate_series((current_date - interval '18 months'), current_date, '1 day'))::date cal_date
)
select cal_date
from calendar
where cal_date between (current_date - interval '14 weeks')::date 
                   and current_date
   or cal_date between ((current_date - interval '1 year')::date - interval '14 weeks')::date 
                   and (current_date - interval '1 year')::date 
order by cal_date;
cal_date -- 2013-09-23 ... 2013-12-30 2014-09-23 ... 2014-12-30