web-dev-qa-db-ja.com

Postgresqlのdatetimeフィールドの日付を比較するにはどうすればいいですか?

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

このコラムを比較すると、さまざまな結果が得られます。次のように:

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

私の質問は、どうすれば最初のクエリを実行して結果を取得できるかということです。3番目のクエリがうまく機能しているのに、最初のクエリがうまくいかないのはなぜですか。

誰かが私をこれで手伝ってくれる?前もって感謝します。

130
user2866264

@Nicolaiはキャストについて正しいので、どのようなデータに対しても条件が偽になります。入力文字列に対する日付の操作を避けたいので、最初の形式をお勧めします。正しいですか。恐れる必要はありません。

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

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

したがって、update_date = '2013-05-03 14: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'

これは常にfalseです

この問題を解決するには、update_dateをdateにキャストします。

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

range型を使用してください。ユーザーが日付を入力した場合

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

ユーザーがタイムスタンプを入力した場合、::date + 1部分は不要

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

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

6
Clodoaldo Neto

日付と比較するには、日付変換を使用してください。

select * from table 
where TO_DATE(to_char(timespanColumn,'YYYY-MM-DD'),'YYYY-MM-DD') = to_timestamp('2018-03-26', 'YYYY-MM-DD')
0