256

postgresql(Windowsのバージョン9.2.4)で日付を比較するときに、奇妙なシナリオに直面しています。
テーブルに「タイムゾーンなしのタイムスタンプ」タイプの 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

私の質問は、最初のクエリで結果を取得できるようにするにはどうすればよいかということです。

4

5 に答える 5

402

@Nicolai は、キャスティングと、データに対して条件が false である理由について正しいです。入力文字列の日付操作を避けたいので、最初の形式を好むと思いますよね?恐れる必要はありません:

SELECT *
FROM table
WHERE update_date >= '2013-05-03'::date
AND update_date < ('2013-05-03'::date + '1 day'::interval);
于 2013-10-19T18:45:55.650 に答える
65

比較すると、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
于 2013-10-19T17:58:24.653 に答える
15

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

于 2013-10-19T18:41:38.373 に答える
6

Date convert を使用して日付と比較します: これを試してください:

select * from table 
where TO_DATE(to_char(timespanColumn,'YYYY-MM-DD'),'YYYY-MM-DD') = to_timestamp('2018-03-26', 'YYYY-MM-DD')
于 2018-04-24T15:10:03.190 に答える