我需要转换一个代表没有时区的时间戳的字符串(即" 2017-03-08T20:53:05") 在某个时区(例如,' Etc / UTC')到具有时区的时间戳。
问题是默认时区不是' Etc / UTC'。所以,当我试图
时SELECT to_timestamp(field1, 'YYYY-MM-DD hh24:mi:ss')::timestamp without time zone at time zone 'Etc/UTC'
它将字符串转换为具有默认时区的值,然后将转换从本地时区应用到' Etc / UTC'。这不是所要求的。
基本上,我正在寻找一种方法告诉postgres原始字符串值表示特定时区的时间,而不是默认的本地时间。
谢谢。
更新:我已检查过上述声明是否有效。
SELECT to_timestamp(field1, 'YYYY-MM-DD hh24:mi:ss')::timestamp without time zone at time zone 'Etc/UTC'
我被客户的时区设置误导了。
答案 0 :(得分:11)
您可以在查询之前运行set time zone UTC;
:
set time zone UTC;
SELECT to_timestamp(field1, 'YYYY-MM-DD hh24:mi:ss')::timestamp without time zone at time zone 'Etc/UTC';
这会解决您的问题吗?
答案 1 :(得分:7)
:timestamp without time zone
,只需:
SELECT to_timestamp(field1, 'YYYY-MM-DD hh24:mi:ss') at time zone 'Etc/UTC'
答案 2 :(得分:2)
我的需要不同于OP。我的字符串已经知道其时区。我只想转换为timestamptz
数据类型。
换句话说:“如何将所需时区中的字符串转换为时间戳”。我可以使用描述的方法here和here;使用::timestamptz
SELECT '2016-01-01 00:00+10'::timestamptz
;
答案 3 :(得分:1)
在我的情况下,这可以解决问题(感谢shajji的回答)
to_timestamp(:date, 'YYYY-MM-DD"T"HH24:MI:SS:MS"Z"') at time zone (select current_setting('timezone')) at time zone 'Etc/UTC'
答案 4 :(得分:0)
首先找到您的默认时区。通过使用以下查询。
Select current_setting('timezone');
在我的情况下,Asia/Karachi
k,现在只需尝试以下查询即可。
Select Cast('1990-01-25' as Date) at time zone '<Your Default Timezone>' at time zone 'utc';
就我而言。
Select Cast('1990-01-25' as Date) at time zone 'Asia/Karachi' at time zone 'utc';