【问题标题】:MySQL - Getting age and numbers of days between two datesMySQL - 获取两个日期之间的年龄和天数
【发布时间】:2014-01-31 19:49:10
【问题描述】:

我正在尝试查询一个巨大的数据库(大约 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 和 left_date 中的数据(格式:yyyy-mm-dd)从名为 user_signup 的表中获取从成员加入到左侧(如果有)的总天数。

【问题讨论】:

    标签: mysql sql select inner-join datediff


    【解决方案1】:

    试试这个:

    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
    

    【讨论】:

      【解决方案2】:

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

      select datediff(date1,date2) from table
      
      
      select datediff(curdate(),date2) from table
      

      【讨论】:

        【解决方案3】:

        获取当前年龄:

        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。这是一个“hack”。 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;
        

        【讨论】:

          【解决方案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
          

          【讨论】:

            猜你喜欢
            • 2016-07-30
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多