【问题标题】:MySQL - how to select id where min/max dates difference is more than 3 yearsMySQL - 如何选择最小/最大日期差异超过 3 年的 id
【发布时间】:2012-04-11 04:41:45
【问题描述】:

我有一张这样的桌子:

| id |           date     |        user_id         |
----------------------------------------------------
| 1  |     2008-01-01     |          10            |
| 2  |     2009-03-20     |          15            |
| 3  |     2008-06-11     |          10            |
| 4  |     2009-01-21     |          15            |
| 5  |     2010-01-01     |          10            |
| 6  |     2011-06-01     |          10            |
| 7  |     2012-01-01     |          10            |
| 8  |     2008-05-01     |          15            |

我正在寻找一种解决方案,如何在 MIN 和 MAX 日期之间的差异超过 3 年的情况下选择 user_id。对于上述数据,我应该得到:

|      user_id        |
-----------------------
|         10          |

有人可以帮忙吗?

【问题讨论】:

  • +1 来自新用户的措辞恰当的问题 :) 欢迎使用 stackoverflow。

标签: mysql sql


【解决方案1】:
SELECT   user_id 
FROM     mytable 
GROUP BY user_id
HAVING   MAX(`date`) > (MIN(`date`) + INTERVAL '3' YEAR);

在这里测试:http://sqlize.com/MC0618Yg58

【讨论】:

  • 有趣的方法;虽然我可能会使用ABS(DATEDIFF(MIN(),MAX())>=365——但两者都是有效的。 -- 虽然,如果你首先列出MAX,你不是总是保证一个正值,并且不需要ABS 调用吗?
  • 虽然这不会只得到年份的差异,而不是分隔它的月份和日期。例如,如果这两个日期分别是 2008-11-01 和 2011-01-01,那么按照您所说的,年份部分相隔 3 年,但如果您查看月份和日期,则少于 3 年。
【解决方案2】:

与 bernie 的方法类似,我会保留原生日期格式。我也可能首先列出 MAX 以避免ABS 调用(确保始终返回正数)。

SELECT   user_id
FROM     my_table
WHERE    DATEDIFF(MAX(date),MIN(date)) > 365

DATEDIFF 只返回两个给定日期字段之间的增量(以天为单位)。

【讨论】:

  • +1。 “品种是生活的调味品,它赋予了它所有的味道。” --William Cowper我相信你想要的标量是1095,我仍然不确定闰年该怎么办。
  • 我认为有一个小错字,即where 而不是having
【解决方案3】:
SELECT user_id
 FROM (SELECT user_id, MIN(date) m0, MAX(date) m1
       FROM table
       GROUP by user_id)
HAVING EXTRACT(YEAR FROM m1) - EXTRACT(YEAR FROM m0) > 3

【讨论】:

    【解决方案4】:
    SELECT A.USER_ID FROM TABLE AS A
    JOIN TABLE AS B 
    ON A.USER_ID = B.USER_ID
    WHERE DATEDIFF(A.DATE,B.DATE) > 365
    

    【讨论】:

    • mysql的DATEDIFF什么时候有第一个参数允许度量?
    • 我很抱歉。已更正。语法混乱。
    • 仍然意识到 DATEDIFF 返回 days 而不是 years,因此您可能还需要更新以检查 365。;-)
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多