【问题标题】:MySQL age from date of birth - TIMESTAMPDIFF()MySQL 从出生日期算起的年龄 - TIMESTAMPDIFF()
【发布时间】: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 我不使用CC++,关键是我不知道什么是完全准确的算法(日期很复杂,有这么多不同的日历,教皇删除天数,.etc) - 完全不可行。仅列出要测试的日期就足够了,这些信息必须在某个地方,人们必须为日期函数编写测试套件。

标签: mysql sql date timestamp


【解决方案1】:

有一些错误,但如果你有最新的说 6 年左右的 MySQL 版本,你应该可以放心使用它:)

some earlier bugs e.g. month diff of dates:
TS1 = '2006-01-21 19:52:05'
TS2 = '2007-01-21 18:30:14'

which gave 0, and not 12.

http://bugs.mysql.com/bug.php?id=16697

http://bugs.mysql.com/bug.php?id=25994

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多