mysql - 差距检测 - 识别跳过/错过的日期

标签 mysql sql datetime gaps-and-islands

我有一个数据库表,其中包含带有ID日期 - 日期范围的记录。

最初将某些 ID 的日期导入到截止日期列中。我只对月份感兴趣,像2018-06-01 00:00:00这样的日期代表2018年的整个iune月。(我对日期和时间不感兴趣,设置01天是因为我不能使用 00)。

2019-01-01(日期自)和 2019-01-01(日期至)代表一个月(一月) .

2018-09-01(日期自)和 2018-11-01(日期至)代表几个月的间隔( 9 月 1 日 - 11 月 31 日)

enter image description here

所以我想要的是获取 ID-s,其中有间隙、错过的月份或月份间隔。我该如何用sql解决这个问题?我该从哪方面开始呢?

最佳答案

在 MySQL 5.x 中,您可以使用相关查询(非常慢)来识别差距。查询的粗略概要:

SELECT *
FROM (
    SELECT id, start_date, start_date - INTERVAL 1 MONTH AS prev_end_date_exp, (
        SELECT end_date
        FROM yourdata AS x
        WHERE id = t.id AND end_date < t.start_date
        ORDER BY end_date DESC
        LIMIT 1
    ) AS prev_end_date_act
    FROM yourdata AS t
) AS sq
WHERE prev_end_date_exp <> prev_end_date_act

这将为您提供一个行列表,其中包含其自身与上一行之间的间隙以及日期范围(而不是列表)。

关于mysql - 差距检测 - 识别跳过/错过的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56902438/

相关文章:

java - 为什么 TableView 不显示从其他列计算值的列值?请给我建议一些解决方案

javascript - 使用 UTC 日期时间值初始化 moment.js

parsing - 如何将 "hh:mm:ss.SSS"的字符串解析为 DateTime

mysql - 如何从左连接中获取前 n 个不同的列值?

MySQL 对关联表上的多行进行过滤

php - SQL 连接 QUERY 多个表和 SELECT

java - 访问 SQL 数据库时避免列名冗余?

python - Pandas-如何获取另一列中每个对应值的行出现次数

php - 重复的 ID 被发送至支付处理商

php - 如何在php中将ISO8601转换为日期格式