如何在新列中将纪元时间转换为日期和时间格式?
How to convert epoch time to date and time format in new columns?
我有一个 table,所有时间列都以 Unix 纪元时间格式存储为 varchar2(254)。我想创建一个新的 table 除了现有的列之外,还有两个新列用于时间戳的日期和时间部分。
例如,对于时间戳 1429152023,两个新列的值将是 2015 年 4 月 16 日和 02:40:23
我尝试使用 to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND')
但无法找到将列附加到新 table 的方法。
我相信这就是你想要的吧?
获取日期:
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
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 (or 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 并仅在最后可能的时刻转换为格式化字符串以供显示。请不要将 date/time 存储为字符串,或将其拆分为两个字符串。使用正确的数据类型。
您还可以使用虚拟列将纪元时间转换为需要的日期:
create table new_table (id number, unixtime varchar2(254),
realtime generated always as (date '1970-01-01' + unixtime/86400));
并用旧 table (SQL Fiddle) 中的值填充它,如果您不只是想将虚拟列添加到原始 table。
或者您可以使用视图代替新视图 table:
create view new_view (id, unixtime, realtime) as
select id, unixtime, date '1970-01-01' + unixtime/86400
from orig_table;
我有一个 table,所有时间列都以 Unix 纪元时间格式存储为 varchar2(254)。我想创建一个新的 table 除了现有的列之外,还有两个新列用于时间戳的日期和时间部分。
例如,对于时间戳 1429152023,两个新列的值将是 2015 年 4 月 16 日和 02:40:23
我尝试使用 to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND')
但无法找到将列附加到新 table 的方法。
我相信这就是你想要的吧?
获取日期:
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
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 (or 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 并仅在最后可能的时刻转换为格式化字符串以供显示。请不要将 date/time 存储为字符串,或将其拆分为两个字符串。使用正确的数据类型。
您还可以使用虚拟列将纪元时间转换为需要的日期:
create table new_table (id number, unixtime varchar2(254),
realtime generated always as (date '1970-01-01' + unixtime/86400));
并用旧 table (SQL Fiddle) 中的值填充它,如果您不只是想将虚拟列添加到原始 table。
或者您可以使用视图代替新视图 table:
create view new_view (id, unixtime, realtime) as
select id, unixtime, date '1970-01-01' + unixtime/86400
from orig_table;