2013-01-23 196 views
0

我有一個數據集似乎有一個「過期」格式的時間(可能是SAS格式,其中時間表示爲自1月1日以來經過的秒數1960)。在一個SQL查詢中,我想將其轉換爲時間戳或日期格式。有沒有一個很好的,乾淨的方式來做到這一點?將時間格式從SAS轉換爲sql(轉換時間到日期)

類似的東西在這裏的答案,但我需要它在psql裏,而不是Python: Time and date on the basis of seconds elapsed since 1970 year

這裏是我的數據樣本:

time_var  
------------- 
1344444527000 
1344448596000 
1344455497000 
1344445125000 

這裏是查詢Ⅰ」型d喜歡做:

select 
    time_var 
    cast(time_var as timestamp) as mytimestamp, 
    cast(time_var as date)  as mydatetime, 
    date(time_var)    as mydate 
from 
    source_dataset 
; 
+0

您正在使用哪種RDBMS? –

+0

...自1960年以來?大多數RDBMS應該允許沿着CAST('1960-01-01'作爲TIMESTAMP)+ 1秒'的行。不過,可能有增加日期/時間間隔的特定功能。 –

+0

我正在使用postgres。我可以從日期獲取間隔,但不能獲得間隔的日期。我正在嘗試東西行'(date'1960-01-01'+間隔強制(time_var作爲varchar))作爲temp_output' –

回答

1

原來我的數據集採用UNIX時間戳,所以值是大整數(額外的零需要被剝離),時間是從1月1日1970年。我從我的老闆那裏獲得了以下代碼來轉換這些:

select 
    timestamp with time zone 'epoch' + interval '1 second' * 
     cast((cast(time_var as bigint)/1000) as integer) as postgres_timestamp, 
    date(timestamp with time zone 'epoch' + interval '1 second' * 
     cast((cast(time_var as bigint)/1000) as integer)) as postgres_date 
0

這是Oracle的例子,可以幫助你。有一些假設,我從你的號碼中刪除了0-s。我希望對您有所幫助您使用什麼數據庫:

SELECT total_days 
    , CAST(end_date AS timestamp) t_stamp 
    , CAST(end_date AS date) final_date_time 
    -- date(end_date) will not work as end_date is date already 
    , TO_CHAR(TRUNC(end_date), 'MM/DD/YYYY') final_date 
    FROM 
    (
    SELECT ROUND(1344444527/60/60/24)   total_days 
     , TO_DATE('01-01-1960','dd-mm-yyyy') start_date 
     , TO_DATE('01-01-1960','dd-mm-yyyy')+ (1344444527/60/60/24) end_date 
    FROM dual 
) 
/

SQL> 

TOTAL_DAYS T_STAMP      FINAL_DATE_TIME  FINAL_DATE 
---------- -------------------------  ------------------- ---------- 
15561  8/8/2002 4:48:47.000000 PM 8/8/2002 4:48:47 PM 08/08/2002