【发布时间】:2014-01-12 02:53:52
【问题描述】:
是的,之前有人问过非常相似的问题,但请耐心等待。
现在人们想出了许多功能来确定从出生日期算起的准确年龄,同时考虑到闰年等等。不过MySQL documentation 提供了一个非常简单的解决方案:
SELECT TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age
这似乎适用于我抛出的所有日期。然而,文档没有说明这个的正确性或它如何计算差异。它似乎确实比简单的diff/365.25 更聪明。
这里有一些例子:
('1992-08-12', '3009-08-12') => 1017 - Correct
('1992-08-12', '3009-08-11') => 1016 - Correct
('1992-02-29', '3009-03-01') => 1017 - Correct
('1992-02-29', '3009-02-28') => 1016 - Correct
对我来说看起来很正确,而且要在很长一段时间内积累一些小错误。
我的问题是,使用它是否安全?你能提供一组日期,这会给出不正确的结果吗? (对小于一天的单位不感兴趣)
【问题讨论】:
-
如果文档说它计算了差异,并且您的所有测试都证实了这一点,那么您为什么会怀疑呢?如果有警告,我想它会这么说。
-
它可能使用类似于这里的算法:alcor.concordia.ca/~gpkatch/gdate-algorithm.html
-
@Barmar 因为它在网络上的其他帖子中被广泛忽略,而支持更大更复杂的算法。我的测试绝不是确定的(我不知道要测试什么)。仅仅因为它在文档中并不意味着它是完全准确的,存在错误,他们可以认为“它足够好”,但我的足够好是不同的。我喜欢事实,而不是猜测。
-
@GeorgeReith 如果你想 100% 确定打开并浏览 mysql 源代码。
-
@peterm 我不使用
C或C++,关键是我不知道什么是完全准确的算法(日期很复杂,有这么多不同的日历,教皇删除天数,.etc) - 完全不可行。仅列出要测试的日期就足够了,这些信息必须在某个地方,人们必须为日期函数编写测试套件。