2017-10-30 3 views
1

日付の列の日付を含むテーブルテストがあります。この列から日付で照会してレコードを取得したい。私はX .AA.AAAAにY .AA.AAAAから日付で照会する場合と、常に(X-1) .AA.AAAにY .AA.AAAAからレコードを得ました。たとえば、01.10.2017から30.10.2017に検索していますが、01-29.10.2017の範囲のレコードがあります。Postgres:フィルタの日付範囲でのSQLクエリ

私が知っているものすべて、イベントサブクエリを試してみましたが、何も助けてくれませんでした。 私の試み:

Select n1.potatoeDate 
    FROM (SELECT potatoeDate from test WHERE potatoeDate > '2017/05/07'::date) n1 
    WHERE n1.potatoeDate <= '2017/05/08'::date; 

    select * 
    from test 
    where potatoeDate between '2017/05/07' and '2017/05/08' 

    SELECT potatoeDate from test 
    where 
    potatoeDate >= '2017/05/07' AND 
    potatoeDate <= '2017/05/08' 

--little hack 
    SELECT potatoeDate from test 
    WHERE 
    potatoeDate >= '2017/05/07'::date 
    AND 
    potatoeDate <= ('2017/05/08'::date)+1; 

のみ最後の少しハッククエリの作業。 :|

誰かが私を助けることができますか? :)

+0

は 'potatoeDate'が型である' timestamp'はありませんか?それは行動を説明するだろう – Adam

+0

はいそれです。理由を説明できますか? – newOne

+0

私の答えを見てください。それが明らかでない場合は、私に知らせてください。 – Adam

答えて

2

potatoeDatetimestampです。

datetimestampを比較すると、timestampはわずか1秒であっても(後で)大きくなります。 datetimestampにキャストし、時間フィールドに00:00:00があることを確認してください。したがって00:00:00とは異なる時間のtimestampが大きくなります。

+0

本当に、あなたは正しいです!唯一の解決策は興味深い時間範囲でクエリにタイムスタンプを追加することです。あなたは他の方法でそれを解決する方法を知っていますか? たとえば、: _場所 '2017/05/07'とタイムスタンプと '2017/05/08 23:59:59'_ – newOne

+0

の間にpotatoeDateを作成することをお勧めします。 (最後の例で行ったように、 'potatoeDate <( '2017/05/08' :: date)+1;')、またはより洗練された '+ INTERVAL '1 day'' 。 – Adam

+0

アダム私のポストを参照してください、私は連結よりも優れたソリューションを発見した。ありがとうございました:) – newOne

1

解決策(@Adamの情報が助けになりました)が見つかりました。この状況では:)

日付型にwhere句に列名をキャストするのに必要な。変更されると、すべてのクエリが期待どおりの結果を返します。

例:

select * 
from test 
where potatoeDate::date between '2017/05/07' and '2017/05/08' 

SELECT potatoeDate from test 
where 
potatoeDate::date >= '2017/05/07' AND 
potatoeDate::date <= '2017/05/08' 
+0

書いても簡単ですが、データベースで評価する方が高価です。私はそれをしないだろう... – Adam

+0

DBはすべてのレコードを日付形式にキャストしなければならないので、それはより高価です。 したがって、この状況では単純連結がより効果的です。 – newOne