私はSQL開発者で、ほとんどの時間をMSSQLに費やしています。 PostgreSQL DBの「タイムゾーンなしのタイムスタンプ」フィールドをフィルタリングするためのより良い方法を探しています。
私が使用しています:
Where
DateField >= '2010-01-01' and
DateField < '2012-01-01'
しかし、私は構文の専門家ではないので、もっと良い方法があると考えなければなりません。
助言がありますか?ありがとう。
あなたの解決策は大丈夫です。ただし、日付がリテラルの場合は、次のようにします。
_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
を返します)。
ところで、私は推奨される慣例に準拠するようにケースを変更しました(キーワードは大文字、識別子は小文字)
日付間隔については、次のようなものを使用できます。
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')
列名のタイプが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」で機能します。