PostgreSQL将带时区的日期转换为时间戳

时间:2018-05-03 08:51:33

标签: sql postgresql datetime timestamp

我的psql数据库中存储的日期格式为DD/MM/YYYY HH24:MI TZ(带时区的日期时间)。我需要将此日期转换为时间戳。

我尝试了to_timestamp()但它没有使用timezone。

ERROR:  "TZ"/"tz"/"OF" format patterns are not supported in to_date

我尝试了:: timestamptz,但它认为日期格式为MM/DD/YYYY HH24:MI TZ

ERROR:  date/time field value out of range

有没有办法将格式从DD/MM/YYYY HH24:MI TZ转换为MM/DD/YYYY HH24:MI TZ或将DD/MM/YYYY HH24:MI TZ转换为时间戳?

e.g。 “2017/04/28 13:00 +2:30”

1 个答案:

答案 0 :(得分:1)

尝试直接投射?..

so=# select to_timestamp('04/28/2017 13:00 +2:30','D/MM/YYYY HH24:MI TZ');
ERROR:  "TZ"/"tz"/"OF" format patterns are not supported in to_date
Time: 20.850 ms
so=# select '04/28/2017 13:00 +2:30'::timestamptz;
      timestamptz
------------------------
 2017-04-28 10:30:00+00
(1 row)

Time: 0.554 ms

https://www.postgresql.org/docs/current/static/functions-formatting.html

  存在

to_timestamp和to_date来处理不能的输入格式   通过简单的铸造转换。对于大多数标准日期/时间格式,   只需将源字符串转换为所需的数据类型即可   更容易。

<强>更新

关于您的评论,您只需调整datestyle即可更改解析:

so=# set datestyle to DMY;
SET
Time: 9.997 ms
so=# select '04/28/2017 13:00 +2:30'::timestamptz;
ERROR:  date/time field value out of range: "04/28/2017 13:00 +2:30"
LINE 1: select '04/28/2017 13:00 +2:30'::timestamptz;
               ^
HINT:  Perhaps you need a different "datestyle" setting.
Time: 10.217 ms
so=# set datestyle to MDY;
SET
Time: 8.799 ms
so=# select '04/28/2017 13:00 +2:30'::timestamptz;
      timestamptz
------------------------
 2017-04-28 10:30:00+00
(1 row)