我想执行检查“表格中是否存在过去100天中的每一个条目”,其中表格具有类似于引用日期列的内容,并且正考虑加入返回sysdate的子查询 - 0,sysdate - 1,... sysdate - 100。
更新(澄清):
这是一个好方法吗?
答案 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 :(得分: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
,然后COUNT
和GROUP BY
。如果您使用的是MySQL,那么在早期的stackoverflow中会涵盖在子查询中生成日期列表的方法(我不太了解MySQL,已经考虑到了已接受的答案)。在大多数其他数据库系统中它更容易。
永久日历表的链接中提到的解决方案也不是那么糟糕。
答案 4 :(得分:1)
在MySQL中:
SELECT * FROM `table_name` WHERE `date_column` > DATE_SUB(CURDATE(), INTERVAL 99 DAY)