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