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

时间:2014-01-13 06:14:29

标签: mysql sql select inner-join datediff

我正在尝试查询一个庞大的数据库(大约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. 我能够获得出生日期,但我想在结果表中获得成员的年龄。数据在users_personal表中存储为“yyyy-mm-dd”。
  2. 我想使用来自join_date&amp;的数据从名为user_signup的表中加入一个成员加入到左边(如果有的话)的总天数。 left_date(格式:yyyy-mm-dd)。

4 个答案:

答案 0 :(得分: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 :(得分:3)

或者你可以这样做......

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

答案 2 :(得分:1)

您可以使用datediff函数查找两天之间的天数,例如

select datediff(date1,date2) from table


select datediff(curdate(),date2) from table

答案 3 :(得分:0)

获取当前年龄:

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

这是如何运作的:

  1. datediff(date1,date2)给出两个日期之间的差异。请注意&#39;生日&#39;的日期格式这是日期:YYYY-MM-DD。
  2. from_days将天数转换为日期格式
  3. date_format函数提取&#39;%Y&#39;只有四位数的年份。不要使用&#39;%y&#39;,因为你只有两位数的年份,有些人年龄超过99岁。
  4. 将字符串乘以1.这是一个&#39; hack&#39;。 MySQL会转换一个字符串,例如&#39; YYYY&#39;成一个整数。
  5. 获取当月的当前年龄(unlikley,但有人可能需要这个)

    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个月。
    3. 在下一步中,月份的提取方式与年份相同,而是标记“%Y&#39;必须更改为&#39;%m&#39;。
    4. 最后将两个值相加。
    5. 以天为单位获取当前年龄非常简单:

      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;