检查最近n天的行是否存在

时间:2011-09-29 17:18:58

标签: mysql sql oracle

我想执行检查“表格中是否存在过去100天中的每一个条目”,其中表格具有类似于引用日期列的内容,并且正考虑加入返回sysdate的子查询 - 0,sysdate - 1,... sysdate - 100。

更新(澄清):

  • 我需要知道过去n天缺少哪些日期
  • 我想避免使用其他表格(也就是临时表格)

这是一个好方法吗?

5 个答案:

答案 0 :(得分:4)

假设您的Oracle表看起来像这样......

CREATE TABLE DATE_TABLE (
    D DATE,
    -- And other fields, PK etc...
)

...并假设D包含“圆形”日期(即没有时间),以下查询将为您提供:min_date:min_date + :day_count之间的所有缺失日期:

SELECT *
FROM (
    SELECT (TO_DATE(:min_date) + LEVEL - 1) GENERATED_DATE
    FROM DUAL
    CONNECT BY LEVEL <= :day_count
)
WHERE
    GENERATED_DATE NOT IN (SELECT D FROM DATE_TABLE)

用简单的英语:

  1. 生成给定时间间隔内的所有日期(子查询)。
  2. 检查表中是否缺少任何一个(超级查询)。

答案 1 :(得分:3)

这就是你要找的东西:

Select seqnum.date, count(issues.id)
from
(
SELECT
    Curdate() - interval (TENS.SeqValue + ONES.SeqValue) day Date
FROM
    (
    SELECT 0 SeqValue 
    UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 
    UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 
    ) ONES
CROSS JOIN
    (
    SELECT 0 SeqValue 
    UNION SELECT 10 UNION SELECT 20 UNION SELECT 30 UNION SELECT 40 UNION SELECT 50 
    UNION SELECT 60 UNION SELECT 70 UNION SELECT 80 UNION SELECT 90 
    ) TENS
) seqnum
left join issues on (cast(issues.created_on as date) = seqnum.date)
group by seqnum.date

我针对Redmine实例运行它,以查看过去100天中每天创建的问题数,包括未创建问题的日期。相应地调整您的数据结构。享受:)

答案 2 :(得分:2)

这可能会帮助你:

create table your_table (a_date date not null);

insert into your_table values (date(now()-interval 0 day));
insert into your_table values (date(now()-interval 1 day));
insert into your_table values (date(now()-interval 2 day));
insert into your_table values (date(now()-interval 3 day));
insert into your_table values (date(now()-interval 5 day));
insert into your_table values (date(now()-interval 6 day));
insert into your_table values (date(now()-interval 9 day));
insert into your_table values (date(now()-interval 10 day));
insert into your_table values (date(now()-interval 50 day));
insert into your_table values (date(now()-interval 60 day));
insert into your_table values (date(now()-interval 70 day));
insert into your_table values (date(now()-interval 80 day));
insert into your_table values (date(now()-interval 90 day));

select a_date,ifnull(datediff(next_date ,a_date)-1,0) as number_of_days_missing_after_date
from
(
select dt.a_date,
(select min(a_date) from your_table dtp where dtp.a_date > dt.a_date and dtp.a_date >= date(now()-interval 100 day))  as next_date
from
(select a_date
from your_table
union select date(now()-interval 100 day)) dt
where dt.a_date >= date(now()-interval 100 day)
) a;

应该告诉您缺少哪些日期。

我创建了表your_table来代替您计划检查缺少日期的表(以便我可以更清楚地向您说明我的示例)。

这个解决方案的唯一问题可能是它不会给你一个缺少日期的列表 - 尽管可以通过查看(在示例中)a_date列和a_date之后缺少的天数来轻松得出它们。

希望它有帮助&amp;祝你好运!

答案 3 :(得分:1)

如果没有任何差距(例如,周末),您可以使用的技巧是

SELECT COUNT(DISTINCT somedate)=100 FROM sometable  -- evaluates to boolean
WHERE somedate>=sysdate-100;

根据您的RDBMS,GROUP BY可能比COUNT DISTINCT工作得更快。

[发表澄清评论]

正如您现在解释的那样,我认为您希望在密集日期列表和表格之间加LEFT JOIN,然后COUNTGROUP BY。如果您使用的是MySQL,那么在早期的stackoverflow中会涵盖在子查询中生成日期列表的方法(我不太了解MySQL,已经考虑到了已接受的答案)。在大多数其他数据库系统中它更容易。

永久日历表的链接中提到的解决方案也不是那么糟糕。

答案 4 :(得分:1)

在MySQL中:

SELECT * FROM `table_name` WHERE `date_column` > DATE_SUB(CURDATE(), INTERVAL 99 DAY)

请参阅MySQL Date Arithmetic

相关问题