2013-10-19 22 views
66

postgresqlの日付を比較すると、私は奇妙なシナリオに直面しています(Windowsのバージョン9.2.4)。私のテーブルの列には、 'タイムゾーンなしのタイムスタンプ'というタイプのupdate_dateがあります。クライアントは日付(2013-05-03)または日付(2013-05-03 12:20:00)のみでこのフィールドを検索できます。この列には、現在のすべての行のタイムスタンプとしての値があり、日付部分(2013-05-03)は同じですが、時間部分の違いがあります。PostgreSQLのdatetimeフィールドの日付を比較するには?

この列を比較すると、私は別の結果を得ています。以下のように:第三クエリは最初のものを働いていないが、なぜ

select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results 

select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results 

select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found 

select * from table where update_date >= '2013-05-03' -> results found 

私の質問はどのように私は結果を得るために、最初のクエリを可能にすることができ、私が意味するのですか?

誰でも私にこれを手伝ってもらえますか?前もって感謝します。

+1

ここでの質問は何ですか? –

+0

Thnaks。私は私の質問を編集しました。 「私の質問は、どのようにして最初のクエリを結果を得ることができるようにすることができるかということです。なぜ3番目のクエリが最初のクエリではなく動作しているのでしょうか? – user2866264

答えて

122

@Nicolaiは、鋳造や理由について正しい::date + 1一部を必要としません。条件は任意のデータに対してfalseです。私は入力文字列の日付操作を避けるために、最初のフォームを好むと思いますか?あなたは恐れる必要はありません:

SELECT * 
FROM table 
WHERE update_date >= '2013-05-03'::date 
AND update_date < ('2013-05-03'::date + '1 day'::interval); 
+0

お返事ありがとうございました。それはあなたの答えに従って動作します。 – user2866264

+0

この構文は( '' 2013-05-03 ':: date'と '' 1day' :: interval')PostgreSQL固有ですか? –

+2

@FrozenFlameはいそうです。標準の構文は 'CAST( '2013-05-03' AS DATE)+ CAST( '1日のAS間隔')(IIRC)となります。 YMMVは 'DATE'と' INTERVAL'の存在と動作に影響します。 –

18

update_date >= '2013-05-03'と比較すると、postgresは値を同じタイプにキャストして値を比較します。あなたの「2013-05-03」は「2013-05-03 00:00:00」にキャストされました。だから、UPDATE_DATEため

=「2013年5月3日午後2時45分00秒」あなたの式は、次のようになります。

'2013-05-03 14:45:00' >= '2013-05-03 00:00:00' AND '2013-05-03 14:45:00' <= '2013-05-03 00:00:00' 

これは、常にdateにUPDATE_DATEキャストこの問題を解決するためのfalse

次のとおりです。

select * from table where update_date::date >= '2013-05-03' AND update_date::date <= '2013-05-03' -> Will return result 
+1

テーブル内の 'update_date 'ごとにキャストするのではなく、クエリパラメータの単一の値をキャストするのは非常に効率が悪く、サーバがそのカラムのインデックスを利用できないようにします。私は-1これに誘惑されています。 –

+1

はい、私は各値のキャストが非効率で、この解決策に対して-1を与えるかもしれないことに同意します。しかし、私は問題の理由を説明し、その問題を示す例を与えました。今すぐuser2866264は、彼のクエリが予想された行を返さない理由を知り、彼のユニークなケースに対して正確な解決策がより良いものを決めるでしょう。 – Nicolai

+0

@ニコライ:お返事ありがとうございました。それはあなたの答えに従って動作します。また、説明に感謝します。 – user2866264

5

rangeタイプを使用してください。ユーザーが日付入力した場合:ユーザーは、タイムスタンプを入力した場合

select * 
from table 
where 
    update_date 
    <@ 
    tsrange('2013-05-03', '2013-05-03'::date + 1, '[)'); 

を、あなたは

http://www.postgresql.org/docs/9.2/static/rangetypes.html

http://www.postgresql.org/docs/9.2/static/functions-range.html

+0

お返事ありがとうございました。それはあなたの答えに従って動作します。 – user2866264

関連する問題