MySQL:查找日期范围之间的缺失日期

时间:2011-07-01 17:19:40

标签: mysql date gaps-and-islands

我需要一些mysql查询的帮助。我有从2011年1月1日到2011年4月30日的数据的数据库表。应该有每个日期的记录。我需要找出表中是否缺少任何日期。

例如,假设2011年2月2日没有数据。我如何找到该日期?

我将日期存储在名为reportdatetime的列中。日期的格式为:2011-05-10 0:00:00,即2011年5月5日12:00:00 am。

有什么建议吗?

5 个答案:

答案 0 :(得分:7)

这是第二个答案,我会单独发布。

SELECT DATE(r1.reportdate) + INTERVAL 1 DAY AS missing_date
FROM Reports r1
LEFT OUTER JOIN Reports r2 ON DATE(r1.reportdate) = DATE(r2.reportdate) - INTERVAL 1 DAY
WHERE r1.reportdate BETWEEN '2011-01-01' AND '2011-04-30' AND r2.reportdate IS NULL;

这是一个自我联接,它会报告日期,使得下一个日期不存在任何行。

这将在差距中找到第一天,但​​如果缺少多天的运行,则不会报告差距中的所有日期。

答案 1 :(得分:5)

  1. CREATE TABLE Days (day DATE PRIMARY KEY);

  2. Days填满您正在寻找的所有日子。

    mysql> INSERT INTO Days VALUES ('2011-01-01');
    mysql> SET @offset := 1;
    mysql> INSERT INTO Days SELECT day + INTERVAL @offset DAY FROM Days; SET @offset := @offset * 2;
    

    然后向上箭头并根据需要多次重复INSERT。它每次都会增加一倍的行数,因此您可以在七个INSERT中获得四个月的行数。

  3. 执行排除联接以查找报告表中不匹配的日期:

    SELECT d.day FROM Days d 
    LEFT OUTER JOIN Reports r ON d.day = DATE(r.reportdatetime) 
    WHERE d.day BETWEEN '2011-01-01' AND '2011-04-30' 
        AND r.reportdatetime IS NULL;`
    

答案 2 :(得分:0)

可以使用更复杂的单个查询来完成,但我将显示带有临时表的代码,仅用于说明:

获取我们有记录的所有日期:

CREATE TEMP TABLE AllUsedDates

SELECT DISTINCT reportdatetime
INTO AllUsedDates;

现在添加5月1日,所以我们跟踪04-30

INSERT INTO AllUsedData ('2011-05-01')

如果没有“第二天”,我们发现了一个差距:

SELECT A.NEXT_DAY
FROM
    (SELECT reportdatetime AS TODAY, DATEADD(reportdatetime, 1) AS NEXT_DAY FROM AllUsed Dates) AS A
WHERE
    (A.NEXT_DATE NOT IN (SELECT reportdatetime FROM AllUsedDates)
    AND
    A.TODAY <> '2011-05-01') --exclude the last day

答案 3 :(得分:0)

如果您的意思是reportdatetime的条目为“2011年2月2日”,则与该日期相关的其他字段不会出现,如下表所示

reportdate  col1    col2
5/10/2011   abc xyz
2/2/2011        
1/1/2011    bnv oda

然后这个查询工作正常

select reportdate from dtdiff where reportdate not in (select df1.reportdate from dtdiff df1, dtdiff df2 where df1.col1 = df2.col1)

答案 4 :(得分:0)

尝试一下

int i1 = BitConverter.ToInt16(dateArray, 0);

如果要在日期时间字段中缺少日期,请使用此选项。

 <div v-if="pokeImg.length > 0">
    <div id="pokemonAFront">
      <img :src="pokeImg[randomA].sprites.front_default" alt="">
    </div>

    <div id="pokemonABack">
      <img :src="pokeImg[randomA].sprites.back_default" alt="">
    </div>
 </div>