【问题标题】:Postgresql 8.3 doesn't understand negative interval greater than a dayPostgresql 8.3 不理解大于一天的负间隔
【发布时间】:2015-02-04 18:19:20
【问题描述】:

Postgresql 8.3 可以理解以下语句:

SELECT '1.12:00:00'::interval
SELECT '12:00:00'::interval
SELECT '-12:00:00'::interval

但是下面的语句不理解:

SELECT '-1.12:00:00'::interval

我收到以下错误:

ERROR:  invalid input syntax for type interval: "-1.00:02:00"

********** Error **********

ERROR: invalid input syntax for type interval: "-1.00:02:00"
SQL state: 22007

如何处理较大的负区间?

【问题讨论】:

  • 为什么你认为一个区间可以在其input中接受一个点来分隔日期和时间?
  • 哇,interval '1.12:00:00' 似乎被解析为 interval '1 day 02:52:48',所以你应该把它读作 1.12 天(这很奇怪,但你不应该依赖这个)。
  • 8.3 版自 2013 年 2 月起停产。请帮自己一个忙并升级到最新版本:8.3 版有几个严重的(安全)错误。 CVE-2013-1899 可能是最糟糕的。
  • 升级问题完全是另一回事,可能会在明年夏天发生,或者由于迁移到 Sql 数据库 (Azure) 而永远不会发生。
  • 感谢您的意见。点符号是由我的简单 c#-app 提供给我的,它将 .net-timespan 转换为 postgres-interval。我还没有超过一天的间隔测试我的例程,但我明天会这样做。

标签: postgresql intervals postgresql-8.3


【解决方案1】:

根据文档for intervals,我认为正确的表示法是:

SELECT '-1 -12:00:00'::interval;  -- Assuming you want an interval equivalent to -36 hours

postgres=# select '-36 hours'::interval = '-1 -12:00:00'::interval;
 ?column? 
----------
 t
(1 row)

顺便说一句,您的 1.12:00:00 符号可能没有达到预期的效果 - 我的解释是您试图表示 36 小时(1 天 + 12 小时) - 由于相同的符号问题。

postgres=# select
postgres-#   '1.12:00:00'::interval = '36 hours'::interval,
postgres-#   '1 12:00:00'::interval = '36 hours'::interval;
 ?column? | ?column? 
----------+----------
 f        | t
(1 row)

【讨论】:

    【解决方案2】:

    根据对我的问题的反应和我自己的调查,问题原来是两种类型的混合使用:.NET 的 TimeSpan 和 NpgsqlTypes.NpgsqlInterval。我已将所有内容更改为 NpgsqlInterval,这解决了我的问题。

    由于省略了 TimeSpan 类型的使用,我现在可以为间隔使用更大的负值。当间隔大于一天(负数)时,TimeSpan 和 Interval 的工作方式不同,因此在这种情况下混合使用这些类型不是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2021-05-14
      • 2011-04-25
      相关资源
      最近更新 更多