Oracle数据库中如何将原始数据转换成标准日期格式

How to convert the raw date into standard date format in Oracle database

在 Oracle 中,我在 varchar 字段中使用 2018-06-02T17:31:55.461Z 格式的日期。我如何将其转换为 Oracle 数据库中的标准日期字段?

create table testmp1
(raw_date varchar2(4000));

insert into testmp1
(raw_date) 
values ('2018-06-02T17:31:55.461Z');

insert into testmp1
(raw_date) 
values ('2018-06-02T17:32:48.042Z');

insert into testmp1
(raw_date) 
values ('2015-04-29T19:51:30.0Z');

commit; 

create table testmp2
(new_date date);

可能您需要转换

 (TO_DATE('2015-04-29T19:51:30.0Z', 'yyyy/mm/dd hh24:mi:ss'));

将字符串拆分成日期和时间,然后转换成日期,例如:

select to_date(substr('2015-04-29T19:51:30.0Z', 1, 10) ||
    substr('2015-04-29T19:51:30.0Z', 12, 8),
    'YYYY-MM-DDHH24:MI:SS')  from dual;

这给了你一个日期。它假定时区始终相同。

select cast(to_timestamp(raw_date,'YYYY-MM-DD"T"HH24:MI:SS.ff3"Z"') as DATE) from testmp1;

insert into testmp2 (new_date) (select cast(to_timestamp(raw_date,'YYYY-MM-DD"T"HH24:MI:SS.ff3"Z"') as DATE) from testmp1);
commit;

您似乎拥有的是标准 JavaScript 时间戳。在这种情况下,您要做的是将它们转换为 Oracle TIMESTAMP 值,然后可能转换为 Oracle DATE 值。

将文本转换为 TIMESTAMP 的格式掩码如下:

YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"

TZ用双引号括起来";它们与 Oracle 无关,根本不需要。您使用 FF3 来获取小数秒,因为有 3 位精度。总结这一切,你会得到:

SELECT TO_TIMESTAMP(raw_date, 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"')
  FROM testmp1;

和:

INSERT INTO testmp2
  ( new_date )
SELECT CAST(TO_TIMESTAMP(raw_date, 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"') AS DATE)
  FROM testmp1;

编辑:@Egret 下面的评论让我想到了时区。时间戳中的Z表示零偏移量或UTC时间;要将其转换为当地时间,您需要执行以下操作:

SELECT TO_TIMESTAMP(raw_date, 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"') - (SYS_EXTRACT_UTC(CURRENT_TIMESTAMP) - CURRENT_TIMESTAMP)
  FROM testmp1;

如果转换为 DATE:

SELECT CAST(TO_TIMESTAMP(raw_date, 'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"') - (SYS_EXTRACT_UTC(CURRENT_TIMESTAMP) - CURRENT_TIMESTAMP) AS DATE)
  FROM testmp1;

希望这对您有所帮助。