MySQL - 获取两个日期之间的年龄和天数

4
我正在尝试查询一个庞大的数据库(大约有2000万条记录)以获取一些数据。这是我现在正在处理的查询。
SELECT a.user_id, b.last_name, b.first_name, c.birth_date FROM users a
INNER JOIN users_signup b ON a.user_id a = b.user_id
INNER JOIN users_personal c ON a.user_id a = c.user_id
INNER JOIN
(
SELECT distinct d.a.user_id FROM users_signup d
WHERE d.join_date >= '2013-01-01' and d.join_date < '2014-01-01'
) 
AS t ON a.user_id = t.user_id

我在尝试从数据库检索附加数据时遇到了一些问题。我想在结果表中添加2个附加字段:

  1. 我能够获取出生日期,但我想在结果表中获取成员的年龄。数据存储为'yyyy-mm-dd'在users_personal表中。
  2. 我想从名为user_signup的表中使用join_date和left_date(格式:yyyy-mm-dd)的数据获取成员加入后到离开当天(如果有)的总天数。
4个回答

4
或者你只需这样做...
SELECT
    TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age_in_years,
    TIMESTAMPDIFF(MONTH, birthday, CURDATE()) AS age_in_month,
    TIMESTAMPDIFF(DAY, birthday, CURDATE()) AS age_in_days,
    TIMESTAMPDIFF(MINUTE, birthday, NOW()) AS age_in_minutes,
    TIMESTAMPDIFF(SECOND, birthday, NOW()) AS age_in_seconds
FROM
    table_name

3
试试这个:
SELECT a.user_id, b.last_name, b.first_name, c.birth_date, 
       FLOOR(DATEDIFF(CURRENT_DATE(), c.birth_date) / 365) age, 
       DATEDIFF(b.left_date, b.join_date) workDays
FROM users a
INNER JOIN users_signup b ON a.user_id a = b.user_id
INNER JOIN users_personal c ON a.user_id a = c.user_id
WHERE b.join_date >= '2013-01-01' AND b.join_date < '2014-01-01'
GROUP BY a.user_id

1
你可以使用datediff函数来查找两个日期之间的天数,例如:
select datediff(date1,date2) from table


select datediff(curdate(),date2) from table

0

获取当前年龄(以年为单位):

SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF(DATE(NOW()), birthday)), '%Y') * 1 AS age FROM table_name;

如何运作:

  1. datediff(date1, date2) 函数可以计算两个日期之间的天数差异。请注意,此处“生日”的日期格式为:YYYY-MM-DD。
  2. from_days 函数将天数转换为日期格式。
  3. date_format 函数使用 '%Y' 提取四位数字年份。不要使用 '%y',因为这只会得到两位数字年份,有些人可能超过99岁。
  4. 将字符串乘以1。这是一种“技巧”。MySQL 将把像 'YYYY' 这样的字符串转换为整数。

获取当前年龄的月数(虽然不太可能,但有人可能需要)

SELECT (DATE_FORMAT(FROM_DAYS(DATEDIFF(DATE(NOW()), birthday)), '%Y') * 1 * 12)
+ (DATE_FORMAT(FROM_DAYS(DATEDIFF(DATE(NOW()), birthday)), '%m') * 1) AS age_in_months
FROM table_name;

这是如何工作的:

  1. 大部分与上面年龄相同。
  2. 年数乘以12。一年有12个月。
  3. 在下一步中,月份的提取方式与年份相同,但必须将标志“%Y”更改为“%m”。
  4. 最后将两个值相加。

获取当前年龄的天数就像这样简单:

SELECT DATEDIFF(DATE(NOW()), birthday) AS age_in_days FROM table_name;

替代代码:

SELECT
    DATE_FORMAT(age_date, '%Y') * 1 AS age_in_years,
    (DATE_FORMAT(age_date, '%Y') * 1 * 12) + (DATE_FORMAT(age_date, '%m') * 1) AS age_in_months,
    age_in_days
FROM
    (SELECT 
        FROM_DAYS(DATEDIFF(DATE(NOW()), birthday)) AS age_date,
        DATEDIFF(DATE(NOW()), birthday) AS age_in_days
    FROM table_name) AS age_date;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接