我在TABLE1的oracle VARCHAR列中有ISO日期格式,我必须将此值插入到TABLE2中,其中我的列数据类型为DATE。
对于例1:
使用以下查询获取错误时,
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
答案 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
语句中执行隐式转换:
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.这样我们就不想手动传递值。
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