【问题标题】:SQL to extract matlab date from postgres dbSQL从postgres db中提取matlab日期
【发布时间】:2010-02-10 03:34:35
【问题描述】:

我想构建一个查询以将 postgresql 日期时间“转换”为 matlab 日期数字。使用其他 DB 的经验告诉我,在 DB 端转换日期比在 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 文档,extracting epochs 和 seconds 等等。我已经接近了。基本上这会得到一个间隔中的秒数,我只需将其除以一天中的秒数:

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

【问题讨论】:

  • 您使用的是哪个 postgresql 版本?我收到一个错误 - '日期/时间字段值超出范围:“0000-01-01 23:10”'在 8.4.2 中尝试查询

标签: sql postgresql matlab


【解决方案1】:

好吧,extract(epoch from t::timestamp) 将给出自 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)

【讨论】:

    【解决方案2】:

    看来是演员阵容出了问题。

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

    像冠军一样工作。

    【讨论】:

    • 我得到错误:日期/时间字段值超出范围:“0000-01-01 00:00”。实际上我读过没有0000年,只有公元前1年,然后是公元1年。没有第 0 年。显然我使用的 postgres 版本尊重这一点。
    猜你喜欢
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多