在 Oracle SQL 中将纪元时间转换为正常的日期时间格式
Posted
技术标签:
【中文标题】在 Oracle SQL 中将纪元时间转换为正常的日期时间格式【英文标题】:convert epoch time into normal datetime format in Oracle SQL 【发布时间】:2021-11-10 08:12:34 【问题描述】:好吧,我将在 oracle sqldeveloper 中将纪元转换为正常的日期时间,我写了下面的代码,但它说“缺少表达式” 我的代码:
SELECT to_date(CreationDate, 'yyyymmdd','nls_calendar=persian')+ EpochDate/24/60/60
from table1
我的桌子1:
ID | EpochDate |
---|---|
100 | 16811048 |
101 | 16810904 |
102 | 12924715 |
103 | 15667117 |
不知道怎么回事!
【问题讨论】:
请提供可重现的示例:将表定义发布为 DDL,示例数据为insert
s。目前您的表没有EpochDate
列
CreationDate列应该是EpochDate,其实我是oracle新手,不知道我的代码有什么问题!
我编辑了我的专栏,但还是没有用
当然不行,因为现在它没有CreationDate
列。步骤很简单: 1) 表的 DDL (create table your_table ( creationdate <datatype>, epochdate <datatype> )
)。 2)insert into your_table values (...)
您没有任何 CreationDate 列。你是怎么用的?!分别添加您的样本数据和您想要的结果。 (两个不同的表,而不是图像)
【参考方案1】:
如果 CreationDate 是 Date
而 EpochDate 是 Varchar
你可以试试这个:
SELECT to_date(to_char(CreationDate, 'yyyymmdd','nls_calendar=persian'),'yyyymmdd') +
EpochDate/24/60/60 as newDate
from table1
或:
select to_date(to_char(CreationDate, 'yyyymmdd','nls_calendar=persian'),'yyyymmdd') +
numtodsinterval(EpochDate,'SECOND') as newDate
from dual
【讨论】:
这次转换to_date(to_char(CreationDate, 'yyyymmdd','nls_calendar=persian'),'yyyymmdd')
的目的是什么?
她需要将她的 CreationDate 转换为波斯日历格式。
我的意思是日期是一样的,它没有格式,日历是关于显示时间的日期表示。唯一可能的原因是他们最初将波斯日期保存为一般日期,但很难说,因为 to_date(reationDate, 'yyyymmdd','nls_calendar=persian')
要么是关于 varchar2
要么依赖于默认的 nls_settings。无论如何,初始语句不应抛出 missing expression,因为它大致相同(只是没有额外的to_char
)。这就是需要样本数据的原因
没有。日期不一样。今天在我们的日历中是 15.09.2021,在他们的日历中是 24.06.1400。
日期是。它的显示不一样,但是date
类型的列中的值应该是一样的【参考方案2】:
让我们用一个例子来告诉你如何
演示数据
SQL> create table c1 ( id number generated always as identity, date_test date) ;
Table created.
SQL> insert into c1 ( date_test ) values ( sysdate ) ;
1 row created.
SQL> insert into c1 ( date_test ) values ( sysdate-365 ) ;
1 row created.
SQL> insert into c1 ( date_test ) values ( sysdate-4000 ) ;
1 row created.
SQL> insert into c1 ( date_test ) values ( sysdate-7200 ) ;
1 row created.
SQL> commit ;
Commit complete.
现在,让我们添加一个名为 epoch
的列,以及一个更容易更新该列的小函数。
SQL> alter table c1 add epoch number ;
Table altered.
SQL> create or replace function date_to_unix_ts( PDate in date ) return number is
l_unix_ts number;
begin
l_unix_ts := ( PDate - date '1970-01-01' ) * 60 * 60 * 24;
return l_unix_ts;
end;
/
Function created
我们根据时间戳字段用真实纪元日期更新列纪元
SQL> update c1 set epoch=date_to_unix_ts (date_test) ;
4 rows updated.
SQL> select * from c1 ;
ID DATE_TEST EPOCH
---------- ---------------------------------------- -----------------
1 2021-09-15 12:25:25 1631708725
2 2020-09-15 12:25:25 1600172725
3 2010-10-03 12:25:25 1286108725
4 2001-12-29 12:25:26 1009628726
SQL> select to_char(to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(EPOCH,'SECOND'),'YYYY-MM-DD HH24:MI:SS') from c1 ;
TO_CHAR(TO_DATE('19
-------------------
2021-09-15 12:25:25
2020-09-15 12:25:25
2010-10-03 12:25:25
2001-12-29 12:25:26
【讨论】:
以上是关于在 Oracle SQL 中将纪元时间转换为正常的日期时间格式的主要内容,如果未能解决你的问题,请参考以下文章
在 Informix 中将 DATETIME 转换为 Unix 纪元
如何在 C 语言 (Linux) 中将 NTP 时间转换为 Unix 纪元时间