私は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番目のクエリがうまく機能しているのに、最初のクエリがうまくいかないのはなぜですか。
誰かが私をこれで手伝ってくれる?前もって感謝します。
@Nicolaiはキャストについて正しいので、どのようなデータに対しても条件が偽になります。入力文字列に対する日付の操作を避けたいので、最初の形式をお勧めします。正しいですか。恐れる必要はありません。
SELECT *
FROM table
WHERE update_date >= '2013-05-03'::date
AND update_date < ('2013-05-03'::date + '1 day'::interval);
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
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
日付と比較するには、日付変換を使用してください。
select * from table
where TO_DATE(to_char(timespanColumn,'YYYY-MM-DD'),'YYYY-MM-DD') = to_timestamp('2018-03-26', 'YYYY-MM-DD')