我想构建一个查询,将postgresql datetime“转换”为matlab datenum。与其他数据库的经验告诉我,在数据库端转换日期比在matlab中更快 。
Matlab将日期存储为自格里高利,不存在日期00-00-0000的任意纪元以来的天数(包括分数)。
在Oracle上,它很简单,因为Oracle在内部存储日期,就像matlab一样,但具有不同的时代。
select (date_column_name - to_date('01-Jan-0001') + 365) ...
直接将此转换为PG语法不起作用:
select (date_column_name - date '01-Jan-0001' + interval 365) ...
我在matlab的某一天开始测试:
>> num2str(datenum('2010-10-02 12:00'))
ans =
734413.5
我整天都在进入和退出pg文档,extract
epoch
和second
等等。我已经接近了。基本上这会得到一个间隔中的秒数,我只是将其除以一天中的秒数:
Select cast(extract(epoch from (timestamp '2010-10-02 12:00'
- timestamp '0000-01-01 23:10'
+ interval '2 day'
)
) as real
)/(3600.0*24.0) AS MDate
答案: 734413.51111111111
但这表现出一些奇怪的行为。调整纪元时间戳的分钟不会改变答案,除非在一个特定的时刻 - 即23:09是一个答案,23:10是另一个答案,它从23:10到23:59保持不变。 (其他时间有相似的行为,但特定的“分钟”是不同的。)
有什么想法吗?也许在另一种方式做到这一点?
编辑: 使用8.4.2
答案 0 :(得分:1)
好吧,提取(来自t :: timestamp的epoch)将自UNIX时代(1970年1月1日)起提供秒数,并为'2010-10-02 12:00:00'生成1286017200。
Matlab给出了相同时间点的734413.5,但这是几天 - 所以63453326400秒,偏移量为62167309200。
因此,要将postgres纪元时间转换为matlab datenum,我们应该只需添加该偏移并转换回日期。
steve=# select (extract(epoch from '2010-10-02 12:00:00'::timestamp) + 62167309200) / (24*3600);
?column?
----------
734413.5
(1 row)
答案 1 :(得分:0)
看来演员是个问题。
Select extract(epoch from (timestamp '2010-10-02 12:00:01'
- timestamp '0000-01-01 00:00'
+ interval '1 day'))/(3600.0*24.0)
就像一个冠军。