Oracle SQL:提取日期和时间来自时间戳时区的时间

时间:2017-08-23 14:48:37

标签: sql oracle

我的表格中有一个START_DATE列,其格式为hobaa。我试图将这些值插入另一个表格但我收到$users = array("hobaa","test"); foreach($users as $user) { $usernames = array(); $usernames['name'][] = $user; } print_r($usernames['name']); 错误。我该如何解决这个问题?

示例SQL语句

YYYY-MM-DD HH:MM:SS AM/PM GMT

示例数据

date format not recognized

如果有帮助,这些是TABLE2中两列的数据类型

  

DATE_WITH_TIMEZONE TIMESTAMP WITH TIME ZONE

     

DATE_WITHOUT_TIMEZONE DATE

1 个答案:

答案 0 :(得分:2)

  

我的表格中有一个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;