请有人帮我检查我的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;
我的实际表输入如下:
no_id | category_license | status | 980401001121 | D | 1 |
---|---|---|
970101110101 | D | 1 |
问题是您想在整个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<的在小提琴