SQL从postgres db中提取matlab日期

时间:2010-02-09 19:19:56

标签: sql postgresql matlab

我想构建一个查询,将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 epochsecond等等。我已经接近了。基本上这会得到一个间隔中的秒数,我只是将其除以一天中的秒数:

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

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)

就像一个冠军。