我尝试将Postgres日期表示格式化为ISO 8601字符串。我假设有一个Postgres函数可以做到,但我发现文档简短的例子。
我的查询是
SELECT
now()::timestamp
返回
[{{2016, 8, 9}, {3, 56, 55, 754181}}]
我试图让日期变成看起来更像的格式
2016-8-9T03:56:55+00:00
。
我需要对查询进行哪些更改才能实现此目的?谢谢你的帮助。
答案 0 :(得分:22)
我认为我找到了一种格式化的方法,但它并不理想,因为我自己编写格式。
这是一个潜在的解决方案:
SELECT to_char (now()::timestamp at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
答案 1 :(得分:15)
也许对于某人而言,知道由于Postgres 9.4 to_json
函数(以及row_to_json
)也将时间戳转换为正确的ISO 8601格式会有所帮助,但此外它还会在引号中包含一个值这可能是不可取的:
SELECT now();
2017-05-10 15:57:23.736054+03
SELECT to_json(now());
"2017-05-10T15:57:23.769561+03:00"
-- in case you want to trim the quotes
SELECT trim(both '"' from to_json(now())::text);
2017-05-10T15:57:23.806563+03:00
答案 2 :(得分:4)
将timezone
会话变量设置为您希望输出所在的时区,然后使用to_char(now(), 'YYYY-MM-DD"T"HH24:MI:SSOF')
如果您使用at time zone '...'
,请注意这将删除所有时区信息,并假设用户已经知道时区。
如果您使用at time zone 'UTC'
,则输出应始终为UTC时间,并带有正确的时区信息(无偏移)。
set timezone='UTC';
select to_char(now(), 'YYYY-MM-DD"T"HH24:MI:SSOF');
2017-11-17T02:02:26+00 /* UTC time */
select to_char(now() at time zone 'Australia/Sydney', 'YYYY-MM-DD"T"HH24:MI:SSOF');
2017-11-17T13:02:26+00 /* Local Sydney time, but note timezone is incorrect. */
set timezone='Australia/Sydney';
select to_char(now(), 'YYYY-MM-DD"T"HH24:MI:SSOF');
2017-11-17T13:02:26+11 /* Local Sydney time with correct time zone! */
select to_char(now() at time zone 'Australia/Sydney', 'YYYY-MM-DD"T"HH24:MI:SSOF');
2017-11-17T13:02:26+00 /* Still local Sydney time, but time zone info has been removed. */
select to_char(now() at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SSOF');
2017-11-17T02:02:26+00 /* Correct UTC time with correct offset. */
This blog post给出了非常详细的解释。
答案 3 :(得分:3)
只有功能对我有用,因为你需要设置时区。
要将默认值时区与zone:
相对应CREATE OR REPLACE FUNCTION date_display_tz(param_dt timestamp with time zone)
RETURNS text AS
$$
DECLARE var_result varchar;
BEGIN
PERFORM set_config('timezone', 'UTC', true);
var_result := to_char(param_dt , 'YYYY-MM-DD"T"HH24:MI:SS:MS"Z"');
RETURN var_result;
END;
$$ language plpgsql VOLATILE;
创建function:
# SELECT
# localtimestamp, current_timestamp,
# to_char(localtimestamp, 'YYYY-MM-DD"T"HH24:MI:SS:MS"Z"'),
# to_char(current_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS:MS"Z"'),
# date_display_tz(localtimestamp), date_display_tz(current_timestamp);
timestamp | now | to_char | to_char | date_display_tz | date_display_tz
----------------------------+-------------------------------+--------------------------+--------------------------+--------------------------+--------------------------
2017-04-27 23:48:03.802764 | 2017-04-27 21:48:03.802764+00 | 2017-04-27T23:48:03:802Z | 2017-04-27T23:48:03:802Z | 2017-04-27T21:48:03:802Z | 2017-04-27T21:48:03:802Z
(1 row)
输出:
test=# select (current_timestamp at time zone 'UTC') at time zone 'UTC';
timezone
-------------------------------
2005-04-22 16:26:57.209082+09
(1 row)
test=# set time zone 'UTC';
SET
test=# select (current_timestamp at time zone 'UTC') at time zone 'UTC';
timezone
-------------------------------
2005-04-22 07:27:55.841596+00
(1 row)
test=# select (current_timestamp at time zone 'UTC');
timezone
----------------------------
2005-04-22 07:28:48.888154
(1 row)
test=# select (current_timestamp at time zone 'UTC')::timestamptz;
timezone
-------------------------------
2005-04-22 07:38:19.979511+00
(1 row)
同时查看this:
如果您希望服务器返回相应的时区信息 另一个时区,我相信你需要使用SET TIME ZONE。 否则,服务器自动(转换时间戳)和 返回服务器的时区。
scaleType="centerCrop"
答案 4 :(得分:1)
这是“将PostgreSQL日期表示形式转换为ISO 8601字符串”的简洁方法:
SELECT to_json(now())#>>'{}'
它将#>>
运算符与to_json()
函数结合使用,二者均可在此页面上找到:
https://www.postgresql.org/docs/current/functions-json.html
运算符“在指定路径上以文本形式获取[s] JSON对象”。但是,当您将空数组文字'{}'
指定为路径时,它将指定根对象。
将此方法与类似方法进行比较:
SELECT
to_json(now())::text AS has_unwanted_quotes,
trim(both '"' from to_json(now())::text) AS a_bit_lengthy,
to_json(now())#>>'{}' AS just_right
较短,但产生的结果相同。
答案 5 :(得分:0)
简单/琐碎:
SELECT REPLACE(NOW()::TEXT, ' ', 'T');
或者如果发烧友需要使用
REGEXP_REPLACE()