使用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/Plus 、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 |