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"
T
和Z
用双引号括起来"
;它们与 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;
希望这对您有所帮助。
在 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"
T
和Z
用双引号括起来"
;它们与 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;
希望这对您有所帮助。