在 Amazon Redshift 中使用自定义时区偏移将 timestamptz 列格式化为以下格式

问题描述 投票:0回答:1

我在 Amazon Redshift 中有一个表,其中包含带有各种时区偏移的时间戳的 timestamptz 列。我需要将这些时间戳格式化为特定的 ISO 8601 格式。

详情:

列名称:timedte
当前格式示例:

 '2024-08-26 23:09:11.949000 +05:55'
 '2024-08-26 23:09:11.949000 +00:00'

所需格式示例:

'2024-08-26T23:09:12+0555' (for +05:55 offset)
'2024-08-26T23:09:12+0000' (for +00:00 offset)

要求:

对于非零时区偏移,请将输出格式设置为 YYYY-MM-DDTHH:MM:SS±HHMM(例如 2024-08-26T23:09:12+0555)。

对于零时区偏移 (UTC),请将输出格式设置为 YYYY-MM-DDTHH:MM:SS±0000(例如 2024-08-26T23:09:12+0000)。

问题:

我尝试了以下查询,但没有产生预期的结果:

sql

SELECT
    to_char(timedte, 'YYYY-MM-DD"T"HH24:MI:SSOF') || 
    LPAD(ABS(EXTRACT(TIMEZONE_HOUR FROM timedte::timestamptz))::TEXT, 2, '0') AS formatted_timedte
FROM t;

问题:

输出的格式不正确,尤其是在处理时区偏移时。

期望的结果:

我需要帮助制作正确的 SQL 查询,该查询可以格式化 timestamptz 列以匹配指定的 ISO 8601 格式。

任何指导或示例将不胜感激!

sql formatting timestamp amazon-redshift
1个回答
0
投票

试试这个:

select to_char(timedte::timestamp, 'YYYY-MM-DD"T"HH24:MI:SS') ||
    replace(split_part(timedte, ' ', 3), ':', '')
    as formatted_timedte 
from t;

使用示例输入字符串之一('2024-08-26 23:09:11.949000 +05:55'),输出

2024-08-26T23:09:11+0555

我正在转换为时间戳(从而完全删除时区),并将时区视为字符串并将格式化版本连接到末尾。这是一种 hack-y,因为它没有完全使用日期或时间转换,但我在文档中没有看到任何支持你想要做的事情。

所以一般情况是:

select to_char(<timestamp_col>::timestamp, 'YYYY-MM-DD"T"HH24:MI:SS') ||
    replace(split_part(<timestamp_col>, ' ', 3), ':', '');
© www.soinside.com 2019 - 2024. All rights reserved.