Oracle SQL:从时间戳时区中提取日期和时间
Posted
技术标签:
【中文标题】Oracle SQL:从时间戳时区中提取日期和时间【英文标题】:Oracle SQL: Extract Date & Time from Timestamp Timezone 【发布时间】:2017-08-23 14:48:36 【问题描述】:我的表中有一个 START_DATE 列,其值的格式为 YYYY-MM-DD HH:MM:SS AM/PM GMT
。我正在尝试将这些值插入到另一个表中,但出现date format not recognized
错误。我该如何解决这个问题?
示例 SQL 语句
INSERT INTO TABLE2 (
DATE_WITH_TIMEZONE,
DATE_WITHOUT_TIMEZONE
)
SELECT
TO_TIMESTAMP(START_DATE, 'YYYY-MM-DD HH:MI:SS AM TZD'),
TO_DATE(TO_TIMESTAMP(START_DATE, 'YYYY-MM-DD HH:MI:SS AM TZD'), 'YYYY-MM-DD HH:MI:SS AM')
FROM TABLE_DATE
样本数据
2016-01-21 09:31:49 AM GMT
2016-02-22 06:37:32 PM GMT
2016-02-23 07:10:52 PM GMT
2016-03-15 08:54:40 PM GMT
2016-03-16 12:10:52 AM GMT
如果有帮助,这些是 TABLE2 中两列的数据类型
DATE_WITH_TIMEZONE TIMESTAMP WITH TIME ZONE
DATE_WITHOUT_TIMEZONE 日期
【问题讨论】:
你知道,你在 to_timestamp 和 to_date 之间少了一个逗号 @OldProgrammer 在格式化问题中的代码时错过了。实际代码包括逗号,我现在编辑了问题。START_DATE
列的数据类型是什么?
你的源表中START_DATE的数据类型是什么,TABLE_DATE?然后:你有一个像 2016-01-21 09:31:49 AM GMT 这样的输入。您想将其转换为没有时区的日期时间。好的,期望的输出是什么? 2016 年 1 月 21 日上午 9 点 31 分 49 秒?或者您是否需要先将其转换为数据库服务器的“本地”时区?不要掉以轻心;如果将此数据插入第二个表的请求来自业务线,请询问他们在该列中需要什么日期时间(没有时区信息)。
【参考方案1】:
我的表中有一个
START_DATE
列,其值的格式为YYYY-MM-DD HH:MM:SS AM/PM GMT
假设您的START_DATE
列属于DATE
数据类型,那么您的陈述不正确; DATE
列没有格式,它是 stored internally as 7-bytes。只有当它被传递到您用来访问数据库的用户界面时,该 UI 才会格式化日期(而不是数据库)。 SQL/Plus 和 SQL 开发人员将使用 NLS_DATE_FORMAT
会话参数(每个用户会话设置并且可以更改)格式化日期,因此依赖这种格式可能会导致您使用的代码不会更改的“有趣”错误但会根据不同用户的会话设置开始和停止工作。
你可以这样做:
INSERT INTO TABLE2 (
DATE_WITH_TIMEZONE,
DATE_WITHOUT_TIMEZONE
)
SELECT FROM_TZ( CAST( START_DATE AS TIMESTAMP ), 'GMT' ),
START_DATE
FROM TABLE_DATE;
如果您的 START_DATE
列是字符串数据类型(为什么要这样做?),那么您需要将其转换为适当的类型:
INSERT INTO TABLE2 (
DATE_WITH_TIMEZONE,
DATE_WITHOUT_TIMEZONE
)
SELECT TO_TIMESTAMP_TZ( START_DATE, 'YYYY-MM-DD HH12:MI:SS AM TZR' ),
CAST( TO_TIMESTAMP_TZ( START_DATE, 'YYYY-MM-DD HH12:MI:SS AM TZR' ) AS DATE )
FROM TABLE_DATE;
【讨论】:
以上是关于Oracle SQL:从时间戳时区中提取日期和时间的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何将日期时间/时间戳从一个时区转换为另一个时区?