是否有将日期转换为年龄的 SQL 查询

Posted

技术标签:

【中文标题】是否有将日期转换为年龄的 SQL 查询【英文标题】:Is there an SQL query to convert a date to an age 【发布时间】:2020-01-22 17:56:14 【问题描述】:

假设我有这个查询:

SELECT CURRENT_DATE-DOB as age FROM customerDetails 
WHERE customerid = (SELECT max(customerid) FROM 
customerDetails)

在 SQLTE3 中转换了客户的出生日期 以例如格式2002-08-11(作为日期字段)到他们当前的年龄,例如17,我可以对 mysql 查询重复相同的逻辑吗...

语法是否不同...因为相同的查询在 MYSQL Workbench 而不是 SQLite3 的 DB Broswswer 中运行时会产生这种情况

20198120

【问题讨论】:

你想要这个解决方案在 mysql 中吗? 检查这个答案。 https://***.com/questions/10506731/get-difference-in-years-between-two-dates-in-mysql-as-an-integer 这个答案彻底解决了这个问题:***.com/questions/48756627/… 【参考方案1】:

另一种方法是:

select YEAR(CURDATE()) - YEAR(20000120)

一些解释:

currdate() 函数返回当前日期 Year() 函数返回给定日期的年份

正如 GMB 所说,上述解决方案将为您的案例返回 18,因为此人将有 17 年零 6 个月。 这将返回年份和月份:

select CONCAT(YEAR(CURDATE()) - YEAR(20020811) -1 
              , '.'
              , ABS(MONTH(CURDATE()) - MONTH(20020811)+1)) as age
FROM customerDetails 
WHERE customerid = (SELECT max(customerid) 
                    FROM customerDetails)

或者如果您使用列名 DOB 更改它:

select CONCAT(YEAR(CURDATE()) - YEAR(DOB) -1 
              , '.'
              , ABS(MONTH(CURDATE()) - MONTH(DOB)+1)) as age
FROM customerDetails 
WHERE customerid = (SELECT max(customerid) 
                    FROM customerDetails)

concat() 连接括号内的参数。 确保 DOB 列是插入出生日期的列...

Here is a DEMO

【讨论】:

这没有考虑日期和月份,所以它的行为就像每个人都是在 1 月 1 日出生的。 感谢@GMB,将解决方案更改为可能有帮助的解决方案...干杯! 当您告诉我包含 WHERE customerid = SELECT max(customerid) FROM customerDetails 时,我将标记为正确 @grimReaperZ,我已经更新了我的答案。请不要忘记您现在也可以投票,因为您有超过 15 分。如果有问题请告诉我...【参考方案2】:

在 SQLServer 中你可以写DATEDIFF(year, GETDATE(), '2002/08/11')

【讨论】:

【参考方案3】:

在 MySQL 中减去日期并不符合您的预期。它实际上将日期转换为整数,然后减去它们。所以通常日期2020-01-22 变成整数20200122。这不是你想要的。

计算年龄的一种方法是使用date function TIMESTAMPDIFF(),如下所示:

timestampdiff(year, dob, curdate())

【讨论】:

以上是关于是否有将日期转换为年龄的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql中根据输入的年龄查询符合该年龄出生日期的数据

SQL 中使用 STR_TO_DATE 的日期转换查询

是否有将分类变量转换为连续变量的 R 函数?

处理 Y2K 日期转换的首选方法?

是否可以创建一个自动将 SQL 值从日期转换为字符串的函数?

将日期转换为另一种格式的 SQL 查询