如何在 sql 中提取没有时区且不将其转换为字符串进行操作的时间戳?
How to extract timestamp without the time zone in sql and without converting it to string for manipulation?
我正在尝试从具有时区数据类型列的时间戳中提取本地时间戳。
我目前有以下 table 架构:
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中内置functions/options没有另一种方法吗?
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
CAST(CAST(ARRIVAL_DTM AS FORMAT 'YYYY-MM-DDBHH:MI:SS') AS VARCHAR(19))
或 TO_CHAR(ARRIVAL_DTM,'YYYY-MM-DD HH:MI:SS')
都可以转换为仅省略时区偏移量的显示值。
我正在尝试从具有时区数据类型列的时间戳中提取本地时间戳。
我目前有以下 table 架构:
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中内置functions/options没有另一种方法吗?
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
CAST(CAST(ARRIVAL_DTM AS FORMAT 'YYYY-MM-DDBHH:MI:SS') AS VARCHAR(19))
或 TO_CHAR(ARRIVAL_DTM,'YYYY-MM-DD HH:MI:SS')
都可以转换为仅省略时区偏移量的显示值。