Table name: sample
--Item--|---datefrom---|--dateto--
Item A |0001-01-01 |2099-01-01
Item B |2017-11-20 |2017-12-31
Item C |2017-11-27 |2017-12-12
假设我们有上述数据。如何以这样的方式构造查询:我将获得当前有效项目的当前日期。
实施例。由今天是2017-11-29,我应该得到ITEM C。
我已经尝试过了,但我只是想知道是否有更有效的查询?
select * from sample where datefrom>= (select datefrom from sample where datefrom < '2017-11-29' order by datefrom desc limit 1 ) and dateto <= (select dateto from sample where dateto > '2017-11-29' order by dateto limit 1)
答案 0 :(得分:1)
以下查询将返回其范围与当前日期重叠的最新项目:
select *
from
(
select *,
row_number() over (order by abs(current_date - datefrom)) rn
from sample
where current_date between datefrom and dateto
) t
where rn = 1;
如果两件或多件物品碰巧与最新品捆绑在一起,并且您想要所有领带,那么只需将row_number
替换为rank
。
但是从我看到你的物品A的范围可能也包括今天。我不确定为什么它的范围从零年开始,或者如果它甚至有效/有意义。
正如@a_horse所指出的,如果我们确定/不关心项目之间的关系是否最近,我们可以使用以下简化查询:
select *
from sample
where current_date between datefrom and dateto
order by abs(current_date - datefrom)
limit 1;