0

我有一个数据集,似乎有“经过”格式的时间(可能是 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
;
4

2 回答 2

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
于 2013-02-05T16:04:20.043 回答
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
于 2013-01-23T19:05:14.337 回答