这是TIMESTAMPDIFF
返回时间戳之间差异的估计值的结果,而不是预期的实际值。
从参考资料,第 435 页(假设为 iSeries):
将元素值转换为请求的间隔类型时使用以下假设:
- 一年有365天。
- 一年有52周。
- 一年有12个月。
- 一个季度有 3 个月。
- 一个月有30天。
- 一周有7天。
- 一天有24小时。
- 一小时有60分钟。
- 一分钟有60秒。
- 一秒有1000000微秒。
实际使用的计算是:
秒 + (分钟 + (小时 + ((天 + (月 * 30) + (年 * 365)) * 24)) * 60) * 60
由于显而易见的原因,这是不准确的。没有帮助。
这似乎是时间戳算术结果返回方式的直接结果。
那是;
SELECT
TIMESTAMP('1971-03-02 00:00:00') - TIMESTAMP('1970-01-01 00:00:00')
FROM sysibm/sysdummy1
返回:
10,201,000,000.000000
Which can be divided into:
1
年
02
月
01
天
00
小时
00
分钟
00
秒
000000
微秒
这是不精确的期间/持续时间信息。虽然在很多情况下这种类型的数据很有用,但这不是其中之一。
简答:在数据库中无法正确计算出准确答案,实际上也不应该。
长答案:
计算是可能的,但相当复杂,绝对不适合数据库内计算。我不打算在这里重现它们(如果你有兴趣,请查看JodaTimeChronology
,特别是各种子类)。你最大的问题是月份的长度并不完全相同。此外,如果您的时间戳不是 UTC,您将遇到重大问题 - 更具体地说,夏令时将对计算造成严重破坏。为什么?因为对于任何国家,偏移量可以随时更改。
也许您可以解释为什么需要毫秒数?希望您正在使用 Java(或能够这样做),并且可以使用java.time
. 但如果你在 iSeries 上,它可能是 RPG ......