在ISO中将ISO Date VARCHAR转换为DATE YYYY-MM-DD HH:MM:SS

时间:2018-03-23 10:02:41

标签: oracle date oracle11g

我在TABLE1的oracle VARCHAR列中有ISO日期格式,我必须将此值插入到TABLE2中,其中我的列数据类型为DATE。

对于例1:

  • VARCHAR String Date1 - 2018-03-23T00:00:00.000 + 00:00
  • 我想将日期数据类型转换为 - MM-DD-YYYY

使用以下查询获取错误时,

INSERT INTO DATE_TEMP (DATE_VALUE) VALUES  (TO_DATE('2018-03-23T00:00:00.000+00:00','DD-MM-YYYY'));

错误代码:

ORA-01861: literal does not match format string

对于例2:   - VARCHAR String Dat2 - 2018-03-23T12:34:56.123 + 00:00

INSERT INTO DATE_TEMP (DATE_VALUE) VALUES TO_TIMESTAMP_TZ('2018-03-23T12:34:56.123+00:00', 'yyyy-mm-dd"T"hh24:mi:ss.ff3TZH:TZM');

错误代码:

ORA-03001: unimplemented feature

3 个答案:

答案 0 :(得分:3)

使用TO_TIMESTAMP_TZ( date_string, format_model )将其转换为TIMESTAMP WITH TIMEZONE数据类型,然后您可以使用AT TIME ZONE 'UTC'将所有值转换为公共时区(因为您使用的是DATE列,这不存储时区信息)并使用CAST( previous_value AS DATE )将其显式转换为DATE数据类型或允许Oracle在INSERT语句中执行隐式转换:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE date_temp ( date_value DATE );

查询1

INSERT INTO DATE_TEMP (
  DATE_VALUE
) VALUES(
  TO_TIMESTAMP_TZ(
    '2018-03-23T00:00:00.000+00:00',
    'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM'
  ) AT TIME ZONE 'UTC'
)

INSERT INTO DATE_TEMP (
  DATE_VALUE
) VALUES(
  TO_TIMESTAMP_TZ(
    '2018-03-23T12:34:56.123+01:00',     -- Note: Different time zone
    'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM'
  ) AT TIME ZONE 'UTC'
)

SELECT * FROM DATE_TEMP

<强> Results

|           DATE_VALUE |
|----------------------|
| 2018-03-23T00:00:00Z |
| 2018-03-23T11:34:56Z | -- Note: value has been converted to the UTC time zone

暂且不说:

  

我想将日期数据类型转换为 - MM-DD-YYYY

日期没有格式 - 它是stored internally to the database 7字节(代表年,月,日,小时,分钟和秒),直到您使用的是任何用户界面(即SQL) /另外,SQL Developer,Java等)尝试将它显示给您,即用户,并将其转换为您认为有效的(通常是字符串)日期具有格式的内容。

如果您只想将其作为日期并且不想要时间组件,那么您可以使用TRUNC( date_value )函数将您的值截断回午夜。

<强>更新

  

是否可以将表1中的记录插入表2.这样我们就不想手动传递值。

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE date_temp ( date_value DATE );

CREATE TABLE string_temp ( string_value VARCHAR2(50) );

INSERT INTO string_temp
SELECT '2018-03-23T00:00:00.000+00:00' FROM DUAL UNION ALL
SELECT '2018-03-23T12:34:56.123+01:00' FROM DUAL;

查询1

INSERT INTO DATE_TEMP ( DATE_VALUE )
SELECT TO_TIMESTAMP_TZ(
         string_value,
         'YYYY-MM-DD"T"HH24:MI:SS.FF3TZH:TZM'
       ) AT TIME ZONE 'UTC'
FROM   string_temp


SELECT * FROM DATE_TEMP

<强> Results

|           DATE_VALUE |
|----------------------|
| 2018-03-23T00:00:00Z |
| 2018-03-23T11:34:56Z |

答案 1 :(得分:2)

如果日期后面的所有内容都是“0”(没有小时,分钟......,正如您的示例所示),则相当简单:

insert into table2 (date_column)
select to_date(substr(date_column, 1, 10), 'yyyy-mm-dd')
  from table1

答案 2 :(得分:2)

您的字符串包含时区信息,因此您需要使用to_timestamp_tz,而不是to_date

to_timestamp_tz('2018-03-23T00:00:00.000+00:00', 'yyyy-mm-dd"T"hh24:mi:ss.ff3TZH:TZM')

如果需要,可以将其转换为日期。

在线示例:http://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=021438eeec836b441b7f23ca57ff5af4

相关问题