4

私はタイム ゾーン ヨーロッパ/ベルリン (+02) にいます。Postgresql は UTC (+00) で実行されています。最新のローカルの真夜中の日付 (私のタイムゾーンでの当日の開始日) のタイムゾーンでタイムスタンプを取得する必要があります。

したがって、2013-03-03 14:00:00+02 がある場合、私の最終結果は次のようになります。

2013-03-03 22:00:00+00
2013-03-04 00:00:00+02 // the same

この日付を取得しようとしました

SELECT TIMESTAMP 'today' AT TIME ZONE 'Europe/Berlin'

残念ながら、これは 00:00 と 02:00 の間に間違った日付 (前日の真夜中) を生成します。これは、UTC 時刻が前日のままであり、今日は utc を使用して残りを計算しているように見えるためです。

ヨーロッパ/ベルリンに 2013-03-03 00:05 がある場合、これが返されます

2013-05-01 22:00:00+00

正しい日付が必要な場合は、使用する必要があります

SELECT date_trunc('day', now() AT TIME ZONE 'Europe/Berlin') AT TIME ZONE 'Europe/Berlin';
2013-05-02 22:00:00+00

これは正しいですが、かなり醜いです。

このコマンドのよりクリーンなバリアントはありますか?

4

3 に答える 3

5

を使用しtimestamptzます。最後のtz意味with time zone

SELECT TIMESTAMPTZ 'today' AT TIME ZONE 'Europe/Berlin'

または、より明確にしたい場合:

SELECT TIMESTAMP with time zone 'today' AT TIME ZONE 'Europe/Berlin'
于 2013-05-03T11:15:27.220 に答える
1

関連する質問に対するアーウィンの回答に基づいて、これは私がそれを行う方法を理解した最も簡単で最速の方法でした:

SELECT timezone('Europe/Berlin', now()::date::timestamp) AS local_midnight_in_utc;

キーは、日付からタイムゾーンを削除するタイムスタンプへのキャストです。

これで「2013-03-03 00:05」のサンプル時間をテストできます。

SELECT timezone('Europe/Berlin', '2013-03-03 00:05'::date::timestamp) AS midnight;

そしてそれは戻ってきます

2013-03-02 23:00:00+00

Explain Analyst によると、これは datetrunc バージョンの約 3 倍の速さです。ベスト オブ 5 の実行に基づく .017ms 対 0.006ms の実行時間。

于 2020-05-06T07:50:38.437 に答える