我有一张表,其中所有时间列都以Unix纪元时间格式存储为varchar2(254)。我想创建一个新表,除了现有列外,还为时间戳的日期和时间部分添加两个新列。
例如,对于时间戳1429152023,两个新列的值将分别为16 Apr 2015和02:40:23
我尝试使用,to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND')
但找不到一种将列追加到新表中的方法。
Oracle DATE类型包含日期和时间元素,精度低至秒。没有理由将相关的日期和时间分成两列;仅包含一列,并提取适当的值以仅用于显示:
create table new_table (id, unixtime, realtime) as
select id, unixtime, date '1970-01-01' + unixtime/86400
from orig_table;
select id, unixtime,
to_char(realtime, 'DD Mon YYYY HH24:MI:SS') as realtime
from new_table;
SQL Fiddle演示(或稍有变化的格式日期和时间,显示为两列。)
您可以将其分为两个VARCHAR2列:
create table new_table (id, unixtime, stringdate, stringtime) as
select id, unixtime,
to_char(date '1970-01-01' + unixtime/86400, 'DD Mon YYYY'),
to_char(date '1970-01-01' + unixtime/86400, 'HH24:MI:SS')
from orig_table;
(SQL Fiddle),但是您将无法轻松比较不同行中的值;将值保留为DATE,并仅在最后可能的时间转换为格式化的字符串以供显示。请不要将日期/时间存储为字符串,也不要将其拆分为两个字符串。使用正确的数据类型。
您还可以使用虚拟列将时代时间转换为按需日期:
create table new_table (id number, unixtime varchar2(254),
realtime generated always as (date '1970-01-01' + unixtime/86400));
如果您不只是想将虚拟列添加到原始表中,请使用旧表中的值(SQL Fiddle)进行填充。
或者,您可以使用视图代替新表:
create view new_view (id, unixtime, realtime) as
select id, unixtime, date '1970-01-01' + unixtime/86400
from orig_table;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句