2017-11-29 32 views
0
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 

上記のデータがあるとします。どのように私は今日の日付を与えられた現在の効果的な項目が得られるような方法でクエリを構築するのですか?PostgreSQLクエリに指定された日付範囲

例。今日は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

を理由だけで、 'どこサンプルから*を選択していない:

としては、私たちが確かであれば、我々は最も近くであることのためのアイテム間の絆を気にしないでください/以下の単純化されたクエリを使用することができ@a_horseによって指摘しましたdatefrom <= now()とdateto = now()datefrom limit 1'で注文しますか? –

+0

有効な項目です。項目Cが優先されます。 – Bigboss

+0

あなたのクエリdoesntは任意の行btwを返します。 – Bigboss

答えて

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_numberrankに置き換えてください。

あなたの商品Aには、今日も含まれる可能性のある範囲があります。なぜその範囲が0年から始まるのか、それが有効である/意味があるのか​​はわかりません。

select * 
from sample 
where current_date between datefrom and dateto 
order by abs(current_date - datefrom) 
limit 1; 
+0

行が返されない場合のデフォルト値として機能します。 – Bigboss

+0

2つ以上の一致があった場合にどの項目が報告されるかを決めるのはいつものようですが? –

+0

現在の日付に最も近い行を返す必要があります。例えば。 ITEM AとITEM Cの間にある。 – Bigboss

関連する問題