Postgresql 使用postgresSQL(红移)仅查询日期范围内的记录
我正在努力抓取从今天到14周前的所有记录。我也需要一年前的那个星期。我有以下资料: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
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