一連の日付を生成するには、これが最適な方法です。
SELECT t.day::date
FROM generate_series(timestamp '2004-03-07'
, timestamp '2004-08-16'
, interval '1 day') AS t(day);
追加date_trunc()
は必要ありません。date
(day::date
)へのキャストは暗黙的にそれを行います。
ただし、日付リテラルをdate
入力パラメーターとしてキャストしても意味がありません。Au contrairetimestamp
は、最良の選択です。パフォーマンスの利点は小さいですが、それを採用しない理由はありません。そして、あなたは不からの変換と結合されたDST(サマータイム)のルール伴わないdate
にtimestamp with time zone
して背中を。下記参照。
同等の、あまり明確ではない短い構文:
SELECT day::date
FROM generate_series(timestamp '2004-03-07', '2004-08-16', '1 day') day;
または、SELECT
リスト内のset-returning関数を使用します。
SELECT generate_series(timestamp '2004-03-07', '2004-08-16', '1 day')::date AS day;
AS
キーワードがされて必要な最後の変形では、Postgresは列の別名を誤って解釈するだろうday
そう。そして、Postgres 10より前のバリアントはお勧めしません-少なくとも同じSELECT
リストに複数のセットを返す関数はありません:
(それはさておき、最後のバリアントは通常、わずかな差で最速です。)
なぜtimestamp [without time zone]
ですか?
のオーバーロードされたバリアントがいくつかありますgenerate_series()
。現在(Postgres 11):
SELECT oid::regprocedure AS function_signature
, prorettype::regtype AS return_type
FROM pg_proc
where proname = 'generate_series';
function_signature | return_type
:------------------------------------------------- ------------------------------- | :--------------------------
generate_series(integer、integer、integer)| 整数
generate_series(integer、integer)| 整数
generate_series(bigint、bigint、bigint)| bigint
generate_series(bigint、bigint)| bigint
generate_series(numeric、numeric、numeric)| 数値
generate_series(numeric、numeric)| 数値
generate_series(タイムゾーンのないタイムスタンプ、タイムゾーンのないタイムスタンプ、間隔)| タイムゾーンのないタイムスタンプ
generate_series(タイムゾーン付きのタイムスタンプ、タイムゾーン付きのタイムスタンプ、間隔)| タイムゾーン付きのタイムスタンプ
(numeric
バリアントはPostgres 9.5で追加されました。)関連するものは、太字のテイクとリターンtimestamp
/の最後の2つtimestamptz
です。
を取得または返すバリアントdate
はありません。を返すには、明示的なキャストが必要ですdate
。timestamp
引数を使用した呼び出しは、関数型解決ルールに降りることなく、入力の追加キャストなしで、最適なバリアントに直接解決されます。
timestamp '2004-03-07'
ところで、完全に有効です。省略された時間部分は、デフォルト00:00
でISO形式になります。
関数型の解決のおかげで、まだ渡すことができますdate
。しかし、それにはPostgresからのより多くの作業が必要です。ある暗黙のキャストからdate
のtimestamp
などから1date
まではtimestamptz
。あいまいになるが、timestamptz
される「好ましい」、「日付/時刻型」の中。したがって、一致はステップ4dで決定されます。:
すべての候補を実行し、(入力データ型の型カテゴリの)優先型を受け入れる候補を、型変換が必要になるほとんどの位置に保持します。優先タイプを受け入れる候補がない場合は、すべての候補を保持します。候補が1つしかない場合は、それを使用します。それ以外の場合は、次のステップに進みます。
関数型解決の余分な作業に加えて、これは余分なキャストをtimestamptz
追加します-これはコストを追加するだけでなく、まれに予期しない結果につながるDSTの問題を引き起こす可能性があります。(DSTはモロニックな概念ですが、これを十分に強調することはできません。)関連:
より高価なクエリプランを示すデモをフィドルに追加しました。
db <>フィドルはこちら
関連: