1

我正在尝试从具有时区数据类型列的时间戳中提取本地时间戳。

我目前有下表架构:

ARRIVAL_DTM TIMESTAMP(0) WITH TIME ZONE

我能够将时间戳转换为日期格式,而无需 teradata 对其强制时区,如下所示:

SEL 
CAST(ARRIVAL_DTM AS DATE AT SOURCE TIME ZONE) AS Date, 
ARRIVAL_DTM AS 'Timestamp with Time Zone' 
From tblname;

结果:

Date         Timestamp with Time Zone
2021-06-01   2021-06-01 23:13:51-06:00
2021-06-01   2021-06-01 23:27:58-06:00
2021-06-02   2021-06-02 01:28:50-06:00
2021-06-02   2021-06-02 02:41:29-06:00

从上面的第一条记录来看,如果应用了时区,日期应该是2021-06-02

我想要做的是提取时间戳而不 td 自动将时区添加到结果中。

我希望得到如下结果,没有时区的列时间戳:

Timestamp without Time Zone               Timestamp with Time Zone
2021-06-01 23:13:51                       2021-06-01 23:13:51-06:00
2021-06-01 23:27:58                       2021-06-01 23:27:58-06:00
2021-06-02 01:28:50                       2021-06-02 01:28:50-06:00
2021-06-02 02:41:29                       2021-06-02 02:41:29-06:00

如果我确实转换为timestamp(0),则最终结果是时间戳,包括我不想要的时区。td 会自动给我时间戳+时区。

SEL 
CAST(ARRIVAL_DTM AS TIMESTAMP(0)) AS Date,
ARRIVAL_DTM AS 'Timestamp with Time Zone' 
From tblname;

结果:

Date                  Timestamp with Time Zone
2019-04-04 19:28:38   2019-04-04 13:28:38-06:00
2019-05-02 19:30:41   2019-05-02 13:30:41-06:00
2019-05-30 16:36:13   2019-05-30 10:36:13-06:00

编辑:

只有当我将其转换为VARCHAR然后使用INSTR等删除正确的 6 个字符时,我才能从时间戳列中提取时区值。这需要大量的字符串操作

TD中的内置功能/选项没有另一种方法吗?

SELECT
    LEFT( 
        CAST( ARRIVAL_DTM AS VARCHAR(40) ),
        CAST( 
            INSTR( CAST( ARRIVAL_DTM AS VARCHAR(40) ),
                    RIGHT( CAST ( ARRIVAL_DTM AS VARCHAR(40) ), 6 )
                 )
        AS INTEGER ) - 1 AS 'Timestamp without Time Zone (VARCHAR)'
    ), 
ARRIVAL_DTM AS 'Timestamp with Time Zone (TIMESTAMP)' 
From tblname;

结果:

Timestamp without Time Zone (VARCHAR)  Timestamp with Time Zone (TIMESTAMP)
2019-06-29 23:22:51                    2019-06-29 23:22:51-06:00
2019-07-16 05:59:46                    2019-07-16 05:59:46-06:00
2019-07-20 18:44:18                    2019-07-20 18:44:18-06:00
4

1 回答 1

1

要么 要么CAST(CAST(ARRIVAL_DTM AS FORMAT 'YYYY-MM-DDBHH:MI:SS') AS VARCHAR(19))应该TO_CHAR(ARRIVAL_DTM,'YYYY-MM-DD HH:MI:SS')转换为简单地省略时区偏移的显示值。

于 2021-07-12T22:39:30.690 回答