【发布时间】: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