postgres '1 年' 等于 '360 天'?

pau*_*ulf 2 postgresql datediff

我想知道是否有其他人遇到过这种情况或知道有关它的信息。

今天是 2014 年 11 月 3 日,如果我检查 2013 年 11 月 5 日是否在去年内,我会得到不同的答案,具体取决于我检查的方式:1 年与 365 天

select now() - '20131105' as diff, 
case when now() - '20131105' <= '1 year' then 'within year' else 'not within year' end as yr_check,
case when now() - '20131105' <= '365 days' then 'within 365 days' else 'not within 365 days' end as day_check

2014-11-03 16:27:38.39669-06;  363 days 16:27:38.39669;  not within year;  within 365 days
Run Code Online (Sandbox Code Playgroud)

好像查询到11月9日的时候,没问题

select now() as right_now, now() - '20131109' as diff, 
case when now() - '20131109' <= '1 year' then 'within year' else 'not within year' end as yr_check,
case when now() - '20131109' <= '365 days' then 'within 365 days' else 'not within 365 days' end as day_check

2014-11-03 16:31:12.464469-06;  359 days 16:31:12.464469;  within year;  within 365 days
Run Code Online (Sandbox Code Playgroud)

有人对此有什么想法吗?或者有什么关于日期算术的有趣之处?

postgres 版本是 9.2.4

Ric*_*ton 5

或者有什么关于日期算术的有趣之处?

这很有趣,好吧,但不是让你发笑的方式。

十二个月必须等于一年,不是吗?

=> SELECT '12 months'::interval = '1 year'::interval;
 ?column? 
----------
 t
Run Code Online (Sandbox Code Playgroud)

好的。说得通。嗯 - 想知道一个月有多长。

=> SELECT '30 days'::interval = '1 month'::interval;
 ?column? 
----------
 t
Run Code Online (Sandbox Code Playgroud)

很公平。假设他们必须挑选一些东西。

嗯——但这意味着……

=> SELECT '360 days'::interval = '12 months'::interval;
 ?column? 
----------
 t
Run Code Online (Sandbox Code Playgroud)

这似乎意味着……

=> SELECT '360 days'::interval = '1 year'::interval;
 ?column? 
----------
 t
Run Code Online (Sandbox Code Playgroud)

那不可能是对的!他们需要做的是一个月等于 30.41666 天。不挂了,闰年呢?嗯 - 这会影响几周吗?啊!

基本上,您无法在时间单位之间进行明智的转换。没有一分钟有 60 秒,没有一天有 24 小时,没有一年有 52 周甚至 365 天。不幸的是,人类(尤其是客户型人类)喜欢在时间单位之间进行转换,所以我们最终会陷入这样的混乱。

PostgreSQL 的系统并不比任何其他系统更疯狂,实际上比大多数系统都要好。