web-dev-qa-db-ja.com

PostgreSQL-日付範囲をフィルタリングします

私はSQL開発者で、ほとんどの時間をMSSQLに費やしています。 PostgreSQL DBの「タイムゾーンなしのタイムスタンプ」フィールドをフィルタリングするためのより良い方法を探しています。

私が使用しています:

Where 
DateField >= '2010-01-01' and 
DateField < '2012-01-01'

しかし、私は構文の専門家ではないので、もっと良い方法があると考えなければなりません。

助言がありますか?ありがとう。

19
Rob S

あなたの解決策は大丈夫です。ただし、日付がリテラルの場合は、次のようにします。

_WHERE datefield >= '2010-01-01 00:00:00' 
 AND  datefield <  '2012-01-01 00:00:00'
_

これはまったく同じように動作しますが、各リテラル「日付」が日付ではなくタイムスタンプであることを明確にするため、保守性が向上します。たとえば、誰かがクエリを次のように変更したとします。

_    AND  datefield <=  '2012-01-01'
_

...クエリに丸一日「2012-01-01」が含まれることを期待しています(そして失敗しています)。後者の構文では、意図がより明確になり、この混乱が防止されます。

それをさらに明確にするために(おそらく冗長すぎます)、明示的なキャストを実行できます。

_WHERE datefield >= '2010-01-01 00:00:00'::timestamp 
 AND  datefield <  '2012-01-01 00:00:00'::timestamp
_

ここでは、同様の理由(潜在的なデータ型の混乱)のためにto_date()を使用しませんし、to_timestamp()も使用しません(timestamptzを返します)。

ところで、私は推奨される慣例に準拠するようにケースを変更しました(キーワードは大文字、識別子は小文字)

31
leonbloy

日付間隔については、次のようなものを使用できます。

WHERE DateField BETWEEN to_date('2010-01-01','YYYY-MM-DD') 
                    AND to_date('2010-01-02','YYYY-MM-DD')

より短く(DateFieldを繰り返す必要がない)、日付形式が明示されています。

1時間/日/月/年の場合:

WHERE date_trunc('day',DateField) = to_date('2010-01-01','YYYY-MM-DD')
4

列名のタイプがBETWEENであり、列名が「タイムスタンプ」でない限り、TIMESTAMPを使用してクエリをシンプルに保つことができます...

SELECT * FROM table WHERE column BETWEEN '2018-12-30 02:19:34' AND '2018-12-30 02:25:34'

これは、日付「2018-12-30」および日付時刻「2018-12-30 02:19:34」で機能します。

0
Phil Andrews