Firebird 2.1 TIMESTAMP 算术和民用间隔

Posted

技术标签:

【中文标题】Firebird 2.1 TIMESTAMP 算术和民用间隔【英文标题】:Firebird 2.1 TIMESTAMP arithmetic and civil intervals 【发布时间】:2011-01-08 09:01:20 【问题描述】:

我的理解是,为了与 Interbase v6 保持一致,Firebird 2.5 不支持 SQL-92 INTERVAL 关键字。至少,建议 this reference 和我重复的 SQLCODE -104 错误试图让 INTERVALs 在 Firebird 的 isql(1) 下工作。

那么,我该如何解释我们在民间计算时间中的不规则性 - 月份并不统一,有储蓄时间和跳跃调整的日子也不一样,更不用说混乱的年份等了 -在 Firebird 2.1 下执行TIMESTAMP 算术时?

如何轻松确定比给定的TIMESTAMP“早一个月”或“晚一周”? “一天后”或“两小时前”怎么样?

【问题讨论】:

【参考方案1】:

您可以使用DateAdd() 和DateDiff() 内置函数。 或者你也可以使用经典的date arithmetic。

【讨论】:

“经典”日期算法。不允许使用民用间隔作为操作数,但 DATEADDDATEDIFF 似乎很合适。 (但是,我无法说服任何一种方法来识别 2009 年 3 月 8 日在我的时区发生的节省时间变化——太糟糕了。) @pilcrow:您无法让它识别 DST 更改,因为这会假定日期/时间是本地的。功能原样似乎与系统时间一起工作,这是一件好事,因为数据库应该始终以 UTC 存储时间戳 @mghie,我的系统和我的 Firebird 服务器是当地时间。 @pilcrow:我猜大多数系统都是这样,但这并不重要。当数据库的使用量增长到不同时区时,人们希望所有时间戳都使用 UTC。另一种可能性是使用每个时间戳将偏移量存储到 UTC,这仍然不允许进行适当的算术运算,并且也没有数据类型。所以 UTC 似乎是唯一向前兼容的方式来存储时间戳。【参考方案2】:

如果这在 Firebird 中没有实现,也许你可以通过调用你的 sql server 的技术来实现,并得到结果时间戳?我知道用 Java 或 .Net 可以很容易地做到这一点

【讨论】:

这当然是一个可行的替代方案,Bishiboosh,但我宁愿一次制定正确的 SQL 或服务器端逻辑,而不是尽可能使用各种客户端多次。【参考方案3】:

也可以使用外部UDF fbudf.dll的functions

【讨论】:

【参考方案4】:

有一个不错的外部 UDF,名为 rFunc:http://rfunc.sourceforge.net/,它具有不错的日期函数,例如 DaysBetween 和 IncDate(d, i1, i2, i3) 等等

【讨论】:

【参考方案5】:
    在循环中从时间戳日期中减去一天,直到月份发生变化。 在循环中从时间戳日期减去一天,直到日期变为 SUNDAY。

【讨论】:

以上是关于Firebird 2.1 TIMESTAMP 算术和民用间隔的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebird 2.1 中优化此查询?

如何在 Firebird 2.1 中临时禁用表中的所有约束?

Firebird日期时间操作

如何测量 Firebird 2.1 数据库上 blob 占用的空间量?

Firebird 2.1 在某些数据库表中存储大量行是不是有效?

Firebird 从 2.1.3 升级到 2.5?