【问题标题】:select rows with users' own time range选择具有用户自己时间范围的行
【发布时间】:2019-01-16 18:06:14
【问题描述】:

我想根据用户自己的时间范围选择行。

假设我有两张桌子。第一个是关于用户活动日志数据的。

| user_id    | date        | activity     |
|:-----------|------------:|:------------:|
| 1          |      1/1/18 |    a1        |
| 1          |     2/12/18 |    a2        |
| 1          |     3/21/18 |    a3        |
| 2          |     1/13/18 |    b1        |
| 2          |      2/4/18 |    b2        |
| 2          |     3/24/18 |    b3        |

第二个表是我要为每个用户提取的时间范围 user_id, start_date, end_date

1, 1/1/18, 3/1/18
2, 2/1/18, 4/1/18

预期的结果是 user_id、日期、活动

1, 1/1/18, a1
1, 2/12/18, a2
2, 2/4/18, b2
2, 3/24/18, b3

【问题讨论】:

  • 我假设这里的日期列是 varchar 或 char 数据类型。最好转换为使用日期、日期时间或时间数据类型,否则无法正确或轻松地比较时间范围
  • 为什么2 | 1/13/18 | b1 不在结果集中?
  • 将日期存储为日期并查看meta.stackoverflow.com/questions/333952/…

标签: mysql


【解决方案1】:

看起来您需要在两个表之间进行简单的 JOIN,并在活动日期使用 BETWEEN 条件:

SELECT ua.*
FROM user_activity ua 
INNER JOIN time_range tr 
    ON ua.date BETWEEN tr.start_date AND tr.end_date

如果您的日期存储为字符串(正如 Raymond 所说,似乎是这种情况),您需要使用 STR_TO_DATE 来转换它们:

ON STR_TO_DATE(ua.date, '%c/%e/%y') BETWEEN 
    STR_TO_DATE(tr.start_date, '%c/%e/%y')
    AND STR_TO_DATE(tr.end_date, '%c/%e/%y') 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2011-03-09
    • 2012-01-16
    相关资源
    最近更新 更多