web-dev-qa-db-ja.com

タイムゾーンオフセットを使用して日付を取得する

Postgresのクエリから日付を抽出しようとしています。タイムスタンプはUTCとして保存されるため、2014年1月1日02:00:00の場合、太平洋時間の日付を2014年1月1日ではなく2013年12月31日にします。私は本当に近いですが、クエリ2と3の両方が2014年1月1日を返します。

SELECT '1-1-2014 02:00:00'::timestamp at time zone 'America/Los_Angeles';

戻り値

2014-01-01 02:00:00-08

-

SELECT CAST('1-1-2014 02:00:00'::timestamp at time zone 'America/Los_Angeles' AS Date);

戻り値

2014-01-01

しかし、私はそれが2013-12-31を返すことを望みます。

SELECT CAST('1-1-2014 00:02:00'::timestamp at time zone 'America/Los_Angeles' AS Date) at time zone 'America/Los_Angeles';

戻り値

2014-01-01 00:00:00

しかし、私はそれが2013-12-31 00:00:00を返すことを望みます

基本的に、日付を現在のタイムゾーン(この場合は太平洋のタイムゾーン)で返したいと思います。

14
WallMobile

タイムゾーンのないタイムスタンプの場合は、最初にUTCタイムゾーンを使用するように指示してから、別のタイムゾーンに変換する必要があります。

SELECT '1-1-2014 02:00:00'::timestamp at time zone 'UTC' at time zone 'America/Los_Angeles';
      timezone       
---------------------
 2013-12-31 18:00:00
32
Clodoaldo Neto

'America/Los_Angeles'が現在のタイムゾーン(現在のセッションのtimezone設定)である場合は、Postgresにtimestampのタイムゾーンを通知するだけです。

SELECT ('2014-01-01 02:00:00'::timestamp AT TIME ZONE 'UTC')::date;

dateへのキャストは、現在のタイムゾーンに基づいており、必要に応じて自動的に機能します。

現在のタイムゾーンが別のものである可能性がある場合は、明示的にする必要があります @ Clodoaldoが示すように

適切な解決策は、最初にtimestamp with time zonetimestamptz)を格納することであり、次にdateにキャストできます。

SELECT '2014-01-01 02:00:00+0'::timestamptz::date;

Postgresのタイムスタンプについて:

詳細を含む最近の関連回答(インデックスも扱っています):

4

間隔を使用して、オフセットを減算して日付を取得できることがわかりました。

SELECT '1-1-2014 02:00:00'::timestamp + INTERVAL '1 hour' * extract(timezone_hour FROM '1-1-2014 00:02:00'::timestamp at time zone 'America/Los_Angeles');

この質問は他の人が知りたいと思うかもしれないので、ここに答えを追加します。

0
WallMobile