将时间格式从SAS转换为sql(将已过去的时间转换为日期)

时间:2013-01-23 17:06:17

标签: sql postgresql datetime timestamp sas

我有一个数据集似乎有“经过时间”格式的时间(可能是SAS格式,其中时间表示为自1960年1月1日以来经过的秒数)。在sql查询中,我想将其转换为时间戳或日期格式。有一个很好的,干净的方法吗?

类似于答案的东西,除了我在psql中需要它,而不是Python: Time and date on the basis of seconds elapsed since 1970 year

以下是我的数据示例:

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

以下是我想要提出的查询类型:

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
;

2 个答案:

答案 0 :(得分:1)

原来我的数据集使用的是UNIX时间戳,因此值是大整数(需要删除额外的零),时间是1970年1月1日。我从我的老板那里获得了以下代码来转换这些:

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

答案 1 :(得分: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