MySQL 选择给定日期位于表中存储的日期之间的行

标签 mysql sql date datetime

假设我有一些数据,例如:

id  status activity_date
--- ------ -------------
101   R     2014-01-12
101   Mt    2014-04-27 
101   R     2014-05-18
102   R     2014-02-19

请注意,对于 id = 101 的行,我们在 2014-01-12 到 2014-04-26 和 2014-05-18 到当前日期之间有事件。

现在我需要选择 status = 'R' 并且日期是给定日期的最新日期的数据,例如如果我搜索 2014-02-02,我会找到在 2014-01-12 创建的状态行,因为该状态在实体 ID 101 的时间仍然有效。

最佳答案

如果我理解正确的话:

第 1 步:将开始日期和结束日期行转换为列。为此,您必须根据以下条件将表与自身连接起来:

SELECT
    dates_fr.id,
    dates_fr.activity_date AS date_fr,
    MIN(dates_to.activity_date) AS date_to
FROM test AS dates_fr
LEFT JOIN test AS dates_to ON 
    dates_to.id = dates_fr.id AND
    dates_to.status = 'Mt' AND
    dates_to.activity_date > dates_fr.activity_date
WHERE dates_fr.status = 'R'
GROUP BY dates_fr.id, dates_fr.activity_date
+------+------------+------------+
| id   | date_fr    | date_to    |
+------+------------+------------+
|  101 | 2014-01-12 | 2014-04-27 |
|  101 | 2014-05-18 | NULL       |
|  102 | 2014-02-19 | NULL       |
+------+------------+------------+

第 2 步:剩下的就很简单了。将查询包装在另一个查询中并使用适当的 where 子句:

SELECT * FROM (
    SELECT
        dates_fr.id,
        dates_fr.activity_date AS date_fr,
        MIN(dates_to.activity_date) AS date_to
    FROM test AS dates_fr
    LEFT JOIN test AS dates_to ON 
        dates_to.id = dates_fr.id AND
        dates_to.status = 'Mt' AND
        dates_to.activity_date > dates_fr.activity_date
    WHERE dates_fr.status = 'R'
    GROUP BY dates_fr.id, dates_fr.activity_date
) AS temp WHERE '2014-02-02' >= temp.date_fr and ('2014-02-02' < temp.date_to OR temp.date_to IS NULL)
+------+------------+------------+
| id   | date_fr    | date_to    |
+------+------------+------------+
|  101 | 2014-01-12 | 2014-04-27 |
+------+------------+------------+

SQL Fiddle

关于MySQL 选择给定日期位于表中存储的日期之间的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32245853/

相关文章:

javascript - 从 Date 对象计算 BST 时间?

php - 错误 : Cannot add or update a child row: a foreign key constraint fails?

sql - 这些数据库设计风格(或反模式)有名字吗?

date - 将管道或转换应用到响应式表单值

sql - 如何枚举SQL中返回的行?

sql - Postgres - 仅为一列插入另一个表中的数据

jquery - 从Chrome的日期类型输入中删除占位符

php - 按升序打印表值

mysql - SQL JOIN 与 OR

mysql - MySQL 有没有办法对变量 Universe 中的特定字段执行 “round robin” ORDER BY ?