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

Mysql 检查最近n天是否存在行,mysql,sql,oracle,Mysql,Sql,Oracle,我想执行一个检查“表中最近100天的每一天是否都有一个条目”,其中表有一个类似于引用日期列的内容,并且正在考虑与返回sysdate-0、sysdate-1、。。。sysdate-100 更新(澄清): 我需要知道过去n天里哪些日期丢失了 我希望避免附加表(也包括临时表) 这是一个好方法吗?如果没有任何间隙(例如周末),您可以使用以下技巧 SELECT COUNT(DISTINCT somedate)=100 FROM sometable -- evaluates to boolean WH

我想执行一个检查“表中最近100天的每一天是否都有一个条目”,其中表有一个类似于引用日期列的内容,并且正在考虑与返回sysdate-0、sysdate-1、。。。sysdate-100

更新(澄清):

  • 我需要知道过去n天里哪些日期丢失了
  • 我希望避免附加表(也包括临时表)

这是一个好方法吗?

如果没有任何间隙(例如周末),您可以使用以下技巧

SELECT COUNT(DISTINCT somedate)=100 FROM sometable  -- evaluates to boolean
WHERE somedate>=sysdate-100;
根据您的RDBMS,
分组依据
可能比
计数不同
工作得更快

[澄清后评论]

正如您现在所解释的,我认为您需要在密集日期列表和表之间进行
左联接,然后进行
计数
分组
。如果您使用的是MySQL,那么在子查询中生成日期列表的方法将在前面介绍(我对MySQL的了解还不够透彻,还没有想到可以接受的答案)。这在大多数其他数据库系统中更容易实现


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

如果没有任何间隙(例如周末),您可以使用以下技巧

SELECT COUNT(DISTINCT somedate)=100 FROM sometable  -- evaluates to boolean
WHERE somedate>=sysdate-100;
根据您的RDBMS,
分组依据
可能比
计数不同
工作得更快

[澄清后评论]

正如您现在所解释的,我认为您需要在密集日期列表和表之间进行
左联接,然后进行
计数
分组
。如果您使用的是MySQL,那么在子查询中生成日期列表的方法将在前面介绍(我对MySQL的了解还不够透彻,还没有想到可以接受的答案)。这在大多数其他数据库系统中更容易实现

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

在MySQL中:

SELECT * FROM `table_name` WHERE `date_column` > DATE_SUB(CURDATE(), INTERVAL 99 DAY)
请参见MySQL中的

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

请参见

这可能会帮助您:

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_表来代替您计划检查丢失日期的表(以便我可以更清楚地向您说明我的示例)

也许这个解决方案唯一的问题是它不会给你一个缺少日期的列表——尽管通过查看(在本例中)a_date列和a_date之后缺少的天数可以很容易地得到它们


希望有帮助&祝你好运

这可能会帮助您:

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_表来代替您计划检查丢失日期的表(以便我可以更清楚地向您说明我的示例)

也许这个解决方案唯一的问题是它不会给你一个缺少日期的列表——尽管通过查看(在本例中)a_date列和a_date之后缺少的天数可以很容易地得到它们


希望有帮助&祝你好运

这就是您要寻找的:

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天中每天创建了多少个问题,包括没有创建问题的日子。相应地调整数据结构。享受:)

这就是你想要的:

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天中每天创建了多少个问题,包括没有创建问题的日子。相应地调整数据结构。享受:)

假设您的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)生成的日期
来自双重

按级别连接假设您的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)生成的日期
来自双重


按级别连接我还想知道我没有行的天数我也想知道我没有行的天数我正在寻找一个没有附加表的解决方案啊。我没有解释得很清楚。我创建的表代表了您希望查询的缺少日期的表。我已经更新了我的答案,试图让它更清楚。我正在寻找一个没有附加表的解决方案啊。我没有解释清楚。我创建的表表示您希望查询的表中缺少的日期。我已更新了我的答案,试图让它更清楚。如何从该查询中获取“缺少”的日期?啊,我刚刚阅读了您更新的问题。获取不同的日期这很容易,但在MySQL中,如果不使用临时表,则很难获得缺少的数据。您能够使用过程吗?对不起,我已经仔细考虑了很久,如果没有临时表,我看不到纯MySQL解决方案。如果您使用另一种语言(如PHP),您可以很容易地做到这一点处理结果。我如何从这个查询中获取“缺失”日期?啊,我刚刚阅读了你的更新问题。获取不同的日期很容易,但是在MySQL中,如果不使用临时表,获取缺失的日期要困难得多。你能用过程吗?对不起,我已经考虑了很久了,没有一个te临时表,我看不到一个纯MySQL解决方案。如果您使用另一种语言(如PHP)来处理结果,您可以很容易地做到这一点。+1,是迄今为止最好的解决方案,但它不能很好地扩展,我希望有更优雅的解决方案;-)您可以在查询中包含数百个,然后在查询之前过滤seqjoining@michael667:请同时检查J的答案