PostgreSQL日期范围查询,带有年和周号

时间:2019-06-09 22:52:01

标签: postgresql

嗨,我想将给定一周的工作时间存储在一个表格中,     小时,年,周

所以我可以快速汇总一周中的小时数,其中周是ISO周数。

然后我想在此表上进行日期范围过滤器查询,假设

2018年12月24日至2019年1月21日(2018年第52周至2019年第4周)。

如果用户通过了年和周,那么我需要对复合索引进行范围检查,在该索引中您首先比较年值,然后再比较周数。

我应该如何构造查询和索引以有效地检索该范围的记录?

这是一个基本尝试,给出了开始年和开始周,以及结束年和结束周:

select year, week, hours
  from
  weekly hours
  where((year = 2018 and week >= 52) OR year > 2018) AND
       ((year = 2019 and week <=3) OR year < 2019)

2 个答案:

答案 0 :(得分:2)

您可以使用<=>=运算符比较多个列:

select *
from weekly_hours
where (year, week) >= (2018,52)
  and (year, week) <= (2019,3);

该查询可以利用两列的索引,例如

create index on weekly_hours (year, week);

答案 1 :(得分:1)

您可以将周数计算为绝对数字,并将其用于范围查询。表达式索引可用于绝对周计算。

create table weekly_hours (
  year int,
  week int,
  hours int
);

insert into weekly_hours 
  (year, week, hours) 
  values 
  (2018, 52, 10), 
  (2019, 4, 9),
  (2019, 10, 9);

-- expression index that generates the absolute week
create index weekly_hours_absweek_idx on weekly_hours((year * 53 + week));

-- range query 
select year, week, hours 
from weekly_hours 
where
    year * 53 + week >= 2018 * 53 + 52
    and year * 53 + week <= 2019 * 53 + 4;