【问题标题】:MySQL Age from Date of Birth (ignore nulls)MySQL 从出生日期算起的年龄(忽略空值)
【发布时间】:2013-12-23 20:07:10
【问题描述】:

我正在尝试根据出生日期计算年龄,我可以使用this thread 成功完成此操作。但是,我的一些 DateOfBirth 具有空值,并且使用下面的公式,结果返回为“2012”而不是(空白/空)。

这是我的桌子:

10/06/1990
01/09/1998
*null*
*null*
02/16/1991

这是我想要的结果:

23
25
(blank)
(blank)
22

到目前为止,这是我的公式:

year(curdate())-year(user.DateOfBirth) - (dayofyear(curdate()) < dayofyear(user.DateOfBirth)) AS 'Age'

这是我实际得到的:

23
25
2012
2012
22

以下是我试图消除“2012”的几件事,这会导致一些加密文本:

IF(user.DateOfBirth > '0001-01-01',AboveFormula,'')
CASE AboveFormula WHEN 2012 THEN '' ELSE AboveFormula END AS 'Age'

【问题讨论】:

  • 日期存储为 DATE 数据类型,对吧?
  • DateOfBirth 存储为日期时间
  • NULL 不存储在字段中。 NULL 是记录中其他地方的隐藏状态位。这就是为什么必须使用特殊机制来测试字段是否为 NULL:DateOfBirth IS NOT NULLDateOfBirth IS NULL

标签: mysql sql


【解决方案1】:

试试这个:

SELECT  CASE
            WHEN user.DateOfBirth IS NULL THEN ""
            ELSE year(curdate())-year(user.DateOfBirth) - (dayofyear(curdate()) < dayofyear(user.DateOfBirth)) 
        END AS 'Age'
FROM    myTable

【讨论】:

  • 这会产生加密文本,例如 0x32303132 或 0x3233(使用 LinqPad)
  • 似乎在这里工作得很好:sqlfiddle.com/#!2/0177e/2/0 我在 sqlfiddle 中添加了一个 ID 列,只是为了更好地描绘行。
【解决方案2】:
SELECT 
CASE
WHEN DateOfBirth IS NULL THEN ""
ELSE 
DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(DateOfBirth , '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(DateOfBirth , '00-%m-%d')) 
END AS age
FROM    myTable

【讨论】:

  • 我认为 OP 想要 IS NULL THEN '' 或在丢失数据的情况下获得空白结果。
【解决方案3】:
SELECT IF(user.DateOfBirth IS NULL,"",
          YEAR(CURDATE()) - YEAR(user.DateOfBirth)
          - IF(DAYOFYEAR(CURDATE()) < DAYOFYEAR(user.DateOfBirth),1,0)
         ) as 'Age'
FROM user

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多