PostgreSQL查询给出了一组日期范围

时间:2017-11-29 08:00:05

标签: postgresql

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)

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;