mariadb 需要根据出生年份使用TIMESTAMPDIFF()函数计算年龄,但某些行返回空值

1cosmwyk  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(146)

请帮我检查一下我的sql语句。我想根据年份来计算人的年龄,但是有些行没有返回实际值。而是空的。原谅我的英语。希望你们能理解我的问题。这是我的sql语句:

select no_id,
    case when substring(no_id,1,2) <Substring(YEAR(NOW()),-2) 
    then Concat('20',substring(no_id,1,2),'-'  ,substring(no_id,3,2),'-', substring(no_id,5,2))
    else
     Concat('19',substring(no_id,1,2),'-'  ,substring(no_id,3,2),'-', substring(no_id,5,2))
    end as dob, TIMESTAMPDIFF(YEAR, no_id, CURDATE()) AS age
from driver_details;

我实际的表格输入如下:
| 编号|类别_许可证|地位|
| - ------| - ------| - ------|
| 小行星98040| D级|1个|
| 小行星970| D级|1个|
在phpmyadmin中运行sql语句后的输出:
| 编号|多布|年龄|
| - ------| - ------| - ------|
| 小行星98040|一九九八年四月一日|二十四|
| 小行星970|一九九七年一月一日|零|
这是我希望在数据库表中返回的预期值。
| 编号|多布|年龄|
| - ------| - ------| - ------|
| 小行星98040|一九九八年四月一日|二十四|
| 小行星970|一九九七年一月一日|二十五|

r7xajy2e

r7xajy2e1#

问题是您想在整个no_id上使用TIMESTAMPDIFF,这是不正确的,因为只有当字符串表示有效的日期时间时,它才能正常工作。
对于像840312135169这样的示例,情况并非如此,因为末尾的“69”将被读作秒,而一分钟只有60秒。
因此,您需要在此列中提供一个有效的日期时间,或者只对列的第一部分(有效日期)运行TIMESTAMPDIFF,并忽略其余部分:

select no_id,
case when substring(no_id,1,2) <Substring(YEAR(NOW()),-2) 
  then Concat('20',substring(no_id,1,2),'-'  ,
    substring(no_id,3,2),'-', substring(no_id,5,2))
  else Concat('19',substring(no_id,1,2),'-'  ,
    substring(no_id,3,2),'-', substring(no_id,5,2)) 
end as dob,  
TIMESTAMPDIFF(YEAR, substring(no_id,1,6), CURDATE()) AS age -- changed here
from driver_license;

参见db<>fiddle

相关问题