我理解为什么postgresql使用month,day和second字段来表示sql interval数据类型。如果涉及夏令时调整,一个月的长度并不总是相同,一天可以有23,24或25小时。这是来自postgresql文档。
但我当时不明白为什么不会因此而在几个月和几天内处理。请参阅以下查询,该查询计算两个时间点之间的秒数可精确计算的精确间隔:
select ('2017-01-01'::timestamp-'2016-01-01'::timestamp); -->366 days.
postgresql选择在几天内给出结果。不是几个月而不是几秒钟。
但为什么结果是天而不是秒?它没有定义天数(它们可以是23,24或25小时)。那他为什么不在几秒钟内给出输出?
那么由于月份的长度也没有定义,为什么postgresql没有输出12个月而不是366天呢?
他并不关心天的长度没有定义,但显然他关心的是月份的长度没有定义。
为什么这种不对称?
有关详细说明,请参阅此查询:
select ('10 days'::interval-'24 hours'::interval); --> 10 days -24:00:00
你看到postgresql正确拒绝回答9天。他非常清楚日常和小时无法互换的问题。但是又为什么第一个查询会返回几天?
答案 0 :(得分:1)
我无法回答你的问题,但我想我可以指出你正确的方向。我认为本书 SQL-99 Complete,Really 是理解SQL间隔的最容易获得的来源。它可以在线获得:https://mariadb.com/kb/en/sql-99/08-temporal-values/。
SQL标准描述了两种间隔:年 - 月间隔和日 - 时间间隔。这样做是为了防止月份和日期部分出现在同一时间间隔内,因为正如您所知,一个月中的天数不明确。 interval '3' month
中的天数取决于您所谈论的三个月。
我认为这是编写第一个查询的详细的标准SQL方法。
select cast(timestamp '2017-01-01' - timestamp '2016-01-01' as interval day to hour) as new_column;
new_column
interval day to hour
--
366 days
我怀疑你会发现,当interval day to hour
之类的东西被省略时,SQL标准有关于SQL dbms应该做什么的规则。 PostgreSQL可能会也可能不会遵循这些规则。
postgresql选择在几天内给出结果。不是几个月而不是几秒钟。
标准SQL可防止月份和日期部分出现在同一时间间隔内。此外,有效秒数范围为0到59.
select interval '59' second;
interval
interval second
--
00:00:59
select interval '60' second;
interval
interval second
--
00:01:00