【问题标题】:Getting the missing dates from a sql table从 sql 表中获取缺失的日期
【发布时间】:2012-03-20 22:40:18
【问题描述】:

我有一个 mysql 表,其中包含以下行:ID、名称、startDate、endDate。

通常,日期应该是连续的,如果缺少间隔,我想提醒用户。

说我插入了这个日期:

2012-03-25 -> 2012-03-29
2012-04-02 -> 2012-04-05

我想显示类似的消息

"No dates found from 2012-03-29 to 2012-04-02. Please insert data for this interval"

可以在不使用 php 浏览整个表格条目的情况下完成此操作吗?

谢谢!

【问题讨论】:

  • 我认为您的解释需要更彻底。例如,如果您有 - 2012-01-03 -> 2012-01-05 和 2012-01-06 ->2-12-01-09,是否需要显示?我的意思是 2012-01-05 和 2012-01-06 之间的差距。
  • 它应该提醒一天丢失,一个条目的 endDate 应该是其他条目的第一个

标签: mysql date datediff


【解决方案1】:
SELECT t1.endDate AS gapStart, (SELECT MIN(t3.startDate) FROM `table` t3 WHERE t3.startDate > t1.endDate) AS gapEnd
FROM `table` t1
LEFT JOIN `table` t2
    ON t1.endDate = t2.startDate
WHERE t2.startDate IS NULL

【讨论】:

    【解决方案2】:

    这行得通。我包含用于创建表和插入数据以进行测试的代码。

     create table dates(
    id int(11) not null auto_increment,
    name varchar(16) not null,
    startDate date,
    endDate date,
    primary key(id)
    );
    
    insert into dates (name,startDate,endDate) 
    values('personA', '2012-03-25', '2012-03-29'),
          ('PersonB','2012-04-02', '2012-04-05');
    

    所以这里是查询:

     select d1.endDate,d2.startDate 
     from dates d1, dates d2 
     where (d1.id+1) =d2.id and d1.endDate < d2.startDate;
    

    【讨论】:

    • 您不能假设 ID 和日期范围都是连续的,尤其是当您认为纠正这种情况需要插入值覆盖间隙时。新插入的行将不按顺序排列。
    • 专注于避免子查询,我错过了那个细节。我赞成你的评论。感谢您分享您的观察。
    【解决方案3】:

    是的,它可以在不使用 PHP 浏览整个表格的情况下完成,而您必须使用 mysql 浏览整个表格。粗略的解决方案是:

    SELECT a.enddate AS start_of_gap, 
    (SELECT MIN(c.startdate)
     FROM yourtable c
     WHERE c.startdate>a.enddate) AS end_of_gap
    FROM yourtable a
    WHERE NOT EXISTS (
       SELECT 1
       FROM yourtable b
       WHERE b.startdate=a.enddate + INTERVAL 1 DAY
    );
    

    我希望,如果我再想一想,将会有一种更有效(但可能不太明显)的方法。

    【讨论】:

    • 你能说得更具体些吗?我有两行,startDate 和 endDate,但您在任何地方都使用了名为 date 的行。谢谢
    • 哎呀——这里有些混乱。没有正确阅读问题并假设数据已标准化。我将修改查询 - 顺便说一句,这些是列或属性 - 而不是行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多