在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"
答案 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')
答案 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;