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 错误试图让 INTERVAL
s 在 Firebird 的 isql(1) 下工作。
那么,我该如何解释我们在民间计算时间中的不规则性 - 月份并不统一,有储蓄时间和跳跃调整的日子也不一样,更不用说混乱的年份等了 -在 Firebird 2.1 下执行TIMESTAMP
算术时?
如何轻松确定比给定的TIMESTAMP
“早一个月”或“晚一周”? “一天后”或“两小时前”怎么样?
【问题讨论】:
【参考方案1】:您可以使用DateAdd() 和DateDiff() 内置函数。 或者你也可以使用经典的date arithmetic。
【讨论】:
“经典”日期算法。不允许使用民用间隔作为操作数,但DATEADD
和 DATEDIFF
似乎很合适。 (但是,我无法说服任何一种方法来识别 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 数据库上 blob 占用的空间量?