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