在 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,示例数据为 inserts。目前您的表没有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 中将纪元时间转换为正常的日期时间格式的主要内容,如果未能解决你的问题,请参考以下文章

在 Google 表格中将 Unix 纪元时间转换为日期

在 Informix 中将 DATETIME 转换为 Unix 纪元

如何在 C 语言 (Linux) 中将 NTP 时间转换为 Unix 纪元时间

如何在 SQL Server 中将纪元时间与 24 小时前进行比较?

在 T-SQL 中将以毫秒为单位的 Epoch 转换为日期

如何在 python 中将 1970 年前的日期转换为纪元? [复制]