2012-08-24 161 views

回答

15

這個問題是相當多的Convert Unixtime to Datetime SQL (Oracle)

逆賈斯汀洞說:

有沒有內置的功能。但是編寫 就比較容易。由於UNIX時間戳是自1月1日的秒數, 1970年

正如你可以不喜歡他們之間的天數去除彼此結果兩個日期:

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; 

由於其在自1970年以來秒數的秒數並不重要。您仍然可以使用時間戳數據類型,雖然叫它...

SQL> select date_to_unix_ts(systimestamp) from dual; 

DATE_TO_UNIX_TS(SYSTIMESTAMP) 
----------------------------- 
        1345801660 

在回答您的意見,我很抱歉,但我沒有看到這種行爲:

SQL> with the_dates as (
    2 select to_date('08-mar-12 01:00:00 am', 'dd-mon-yy hh:mi:ss am') as dt 
    3  from dual 
    4  union all 
    5 select to_date('08-mar-12', 'dd-mon-yy') 
    6  from dual) 
    7 select date_to_unix_ts(dt) 
    8 from the_dates 
    9   ; 

DATE_TO_UNIX_TS(DT) 
------------------- 
     1331168400 
     1331164800 

SQL> 

有3,600秒的差距,即1小時。

+0

我傳遞給PDATE價值來自 $ SQL =選擇TO_DATE(TO_CHAR(fld_from_date,'DD-Mon-YY HH:MI:SS AM'),'DD-Mon-YY HH:MI:SS AM')AS date_for_unix_timestamp) 假設TO_CHAR(fld_from_date,'DD- YY HH:MI:SS AM')在上面的查詢結果'08 - Mar-12 01:00:00 AM',這個char的to_date covesrion出來只是'08 -Mar-12',什麼是HH:MI:SS(01:00:00 AM)沒有出現的原因? – deepti

+0

嗨@deepti,沒有必要發佈另一個答案。您可以隨時點擊您問題上的修改鏈接並在此處進行更改。評論也留下了通知。我已經更新了我的答案;缺乏可見性可能只是與您的客戶有關? – Ben

+0

學習時間和閏秒我不得不說你的程序化解決方案是正確的,但引用的Unix時間定義並不是:Unix時間不是自1.1.1970以來的秒數,而是「1.1天以來的天數」。 1970年代60 * 60 * 24加上今天午夜以來的秒數! – Falco

10

我意識到一個答案已被接受,但我認爲應該明確,該答案中的函數不考慮傳入日期的時區偏移量。一個適當的Unix時間戳應在GMT(+0)計算。除非另有說明,Oracle的to_date函數假定傳入的日期位於本地時區。夏令時是真實的事實,這個問題更加嚴重。我來到過這個問題有以下功能:

create or replace 
    function unix_time_from_date 
     (
     in_date in date, 
     in_src_tz in varchar2 default 'America/New_York' 
    ) 
    return integer 
    as 
    ut  integer  := 0; 
    tz  varchar2(8) := ''; 
    tz_date timestamp with time zone; 
    tz_stmt varchar2(255); 
    begin 
    /** 
    * This function is used to convert an Oracle DATE (local timezone) to a Unix timestamp (UTC). 
    * 
    * @author James Sumners 
    * @date 01 February 2012 
    * 
    * @param in_date An Oracle DATE to convert. It is assumed that this date will be in the local timezone. 
    * @param in_src_tz Indicates the time zone of the in_date parameter. 
    * 
    * @return integer 
    */ 

    -- Get the current timezone abbreviation (stupid DST) 
    tz_stmt := 'select systimestamp at time zone ''' || in_src_tz || ''' from dual'; 
    execute immediate tz_stmt into tz_date; 
    select 
     extract(timezone_abbr from tz_date) 
    into tz 
    from dual; 

    -- Get the Unix timestamp 
    select 
     (new_time(in_date, tz, 'GMT') - to_date('01-JAN-1970', 'DD-MM-YYYY')) * (86400) 
    into ut 
    from dual; 

    return ut; 
end unix_time_from_date; 

我有一些伴侶功能,unix_timeunix_time_to_date,可在http://jrfom.com/2012/02/10/oracle-and-unix-timestamps-revisited/。我無法相信甲骨文在沒有實現這一點的情況下一直到11g。

1

日期:

FUNCTION date_to_unix (p_date date,in_src_tz in varchar2 default 'Europe/Kiev') return number is 
begin 
    return round((cast((FROM_TZ(CAST(p_date as timestamp), in_src_tz) at time zone 'GMT') as date)-TO_DATE('01.01.1970','dd.mm.yyyy'))*(24*60*60)); 
end; 

的時間戳:

FUNCTION timestamp_to_unix (p_time timestamp,in_src_tz in varchar2 default 'Europe/Kiev') return number is 
    begin 
     return round((cast((FROM_TZ(p_time, in_src_tz) at time zone 'GMT') as date)-TO_DATE('01.01.1970','dd.mm.yyyy'))*(24*60*60)); 
    end; 
0

這就是我想出了:

select substr(extract(day from (n.origstamp - timestamp '1970-01-01 00:00:00')) * 24 * 60 * 60 + 
      extract(hour from (n.origstamp - timestamp '1970-01-01 00:00:00')) * 60 * 60 + 
      extract(minute from (n.origstamp - timestamp '1970-01-01 00:00:00')) * 60 + 
      trunc(extract(second from (n.origstamp - timestamp '1970-01-01 00:00:00')),0),0,15) TimeStamp 
      from tablename; 

FWIW

0
SELECT 
to_char(sysdate, 'YYYY/MM/DD HH24:MI:SS') dt, 
round((sysdate - to_date('19700101 000000', 'YYYYMMDD HH24MISS'))*86400) as udt 
FROM dual; 
+4

總是建議爲您的代碼添加一些解釋,特別是爲什麼它與其他答案不同,如果已經有很多 – Bowdzone

0

我使用下面的方法,它不同於一點點從其他的答案,因爲它使用sessiontimezone()功能正常獲取日期

select 
    ( 
     cast((FROM_TZ(CAST(in_date as timestamp), sessiontimezone) at time zone 'GMT') as date) -- in_date cast do GMT 
     - 
     TO_DATE('01.01.1970','dd.mm.yyyy') -- minus unix start date 
    ) 
    * 86400000 -- times miliseconds in day 
    from dual; 
0
SELECT (SYSDATE - TO_DATE('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) * 24 * 60 * 60 * 1000 FROM DUAL