将数字转换为日期

时间:2016-01-05 15:06:14

标签: sql oracle date select

在Oracle中,我有一个名为Create_date的列,其数据返回为1400003659,1400072380和1403796514作为示例。列类型为NOT NULL NUMBER(15)。我试图编辑我的SELECT语句以将这些值作为日期返回(或者这些日期和时间是什么?)。

我已经尝试了下面的内容,但都返回了错误

SELECT to_date(Create_date, 'YYMMDD'),

SELECT to_date(to_char(Create_date), 'YYMMDD'),

SELECT to_timestamp(Create_date, 'YYMMDD'),

SELECT to_date(LPAD(Create_date, 15, '0'), 'YYMMDD'),

SELECT to_date(LPAD(Create_date), 'YYMMDD'),

我收到的示例错误消息:

SQL Error: ORA-01843: not a valid month
01843. 00000 -  "not a valid month"

4 个答案:

答案 0 :(得分:4)

这看起来像一个unix时间戳,它是自1970年1月1日以来的秒数。

如果您只想要日期,则需要计算天数并将其添加到1/1/1970,如下所示:

to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1400003659,'SECOND')

如果您想保留时间戳,可以这样做:

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

See this for more information.

答案 1 :(得分:0)

试试这样:

select to_date('01-01-1970 1:00:00','MM-DD-YYYY HH24:Mi:SS') + (1400003659/86400) from dual;

<强> FIDDLE DEMO

答案 2 :(得分:0)

您需要知道该数字的含义。

如果这些是UNIX日期(自1970年1月1日以来的秒数),则可以通过将值/ 86400(一天中的秒数)添加到1970年1月1日来使用该基线中的简单日期算法:

select to_date('01011970','ddmmyyyy') + (1400003659/86400) from dual;

returns: 13/05/2014 5:54:19 PM

答案 3 :(得分:0)

答案不准确! UNIX时间是自1970-01-01 00:00:00 UTC!

以来的秒数

因此,除非您的数据库服务器在UTC上运行,否则您应该这样做:

SELECT
   (TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' 
        + 1400003659 * INTERVAL '1' SECOND) AT LOCAL
FROM dual;

SELECT
   (TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' 
         + numtodsinterval(1400003659,'second')) AT LOCAL
FROM dual;

或获取数据库服务器操作系统时区的时间

SELECT
   (TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' 
         + numtodsinterval(1400003659,'second')) AT TO_CHAR(SYSTIMESTAMP, 'tzr')
FROM dual;