我需要一些有关 mysql 查询的帮助。我有一个 db 表,其中包含 2011 年 1 月 1 日至 2011 年 4 月 30 日的数据。每个日期都应该有记录。我需要找出表格中是否缺少任何日期。
例如,假设 2011 年 2 月 2 日没有数据。我如何找到那个日期?
我将日期存储在名为 reportdatetime 的列中。日期的存储格式为:2011-05-10 0:00:00,即 2011 年 5 月 5 日凌晨 12:00:00。
有什么建议么?
我需要一些有关 mysql 查询的帮助。我有一个 db 表,其中包含 2011 年 1 月 1 日至 2011 年 4 月 30 日的数据。每个日期都应该有记录。我需要找出表格中是否缺少任何日期。
例如,假设 2011 年 2 月 2 日没有数据。我如何找到那个日期?
我将日期存储在名为 reportdatetime 的列中。日期的存储格式为:2011-05-10 0:00:00,即 2011 年 5 月 5 日凌晨 12:00:00。
有什么建议么?
这是第二个答案,我将单独发布。
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;
这是一个自联接,它报告一个日期,使得不存在具有以下日期的行。
这将找到间隔中的第一天,但如果缺少多天的运行,它将不会报告间隔中的所有日期。
CREATE TABLE Days (day DATE PRIMARY KEY);
填写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 中获得四个月的行数。
执行排除联接以查找报告表中不匹配的日期:
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;`
如果您的意思是 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)
它可以通过更复杂的单个查询来完成,但我将展示一个带有临时表的伪代码,仅用于说明:
获取我们有记录的所有日期:
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
尝试这个
SELECT DATE(t1.datefield) + INTERVAL 1 DAY AS missing_date FROM table t1 LEFT OUTER JOIN table t2 ON DATE(t1.datefield) = DATE(t2.datefield) - INTERVAL 1 DAY WHERE DATE(t1.datefield) BETWEEN '2020-01-01' AND '2020-01-31' AND DATE(t2.datefield) IS NULL;
如果您想在日期时间字段中获取缺失的日期,请使用此选项。
SELECT CAST(t1.datetime_field as DATE) + INTERVAL 1 DAY AS missing_date FROM table t1 LEFT OUTER JOIN table t2 ON CAST(t1.datetime_field as DATE) = CAST(t2.datetime_field as DATE) - INTERVAL 1 DAY WHERE CAST(t1.datetime_field as DATE) BETWEEN '2020-01-01' AND '2020-07-31' AND CAST(t2.datetime_field as DATE) IS NULL;