首页 文章

SQL从postgres db中提取matlab日期

提问于
浏览
0

我想构建一个查询"convert" 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文档, 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

    好吧,提取(来自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

    看来演员是个问题 .

    Select extract(epoch from (timestamp '2010-10-02 12:00:01' 
           - timestamp '0000-01-01 00:00' 
           + interval '1 day'))/(3600.0*24.0)
    

    像冠军一样工作 .

相关问题