嗨,我想将给定一周的工作时间存储在一个表格中, 小时,年,周
所以我可以快速汇总一周中的小时数,其中周是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)
答案 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;