将时间格式从 SAS 重新转换为 SQL(转换迄今为止经过的时间)



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

类似于这里的答案,除了我需要它在 psql 中,而不是 Python:基于自1970年以来经过的秒数的时间和日期

以下是我的数据示例:

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
;

事实证明,我的数据集使用的是 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

这是可能对您有所帮助的 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

相关内容

  • 没有找到相关文章

最新更新