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:从时间戳时区中提取日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

如何从java中的字符串时间戳中提取日期和时间

使用带时区的时间戳提取日期

Python:如何将日期时间/时间戳从一个时区转换为另一个时区?

我正在使用 Oracle SQL Developer 并希望从时间戳中提取星期几。我的语法是不是正确?

SqlServer时间戳

SQL 从时间戳中提取小时