如何在新列中将纪元时间转换为日期和时间格式?

时间:2015-07-18 11:31:57

标签: sql oracle oracle11g unix-timestamp

我有一个表,其中Unix纪元时间格式的所有时间列都存储为varchar2(254)。我想创建一个新表,除了现有列之外,还有两个新列用于时间戳的日期和时间部分。

例如,对于时间戳1429152023,这两个新列将具有值16 Apr 2015和02:40:23

我尝试使用to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND'),但无法找到将列附加到新表格的方法。

2 个答案:

答案 0 :(得分:0)

我相信这就是你追求的目标吗?

获取日期:

SELECT to_char(to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(a,'SECOND'),'YYYY-MM-DD') from a

抽出时间:

SELECT to_char(to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(a,'SECOND'),'HH24:MI:SS') from a

答案 1 :(得分:0)

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 demo(或a slight variation,格式化的日期和时间为两列供显示。)

可以将其拆分为两个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;

SQL Fiddle