ein Datum Tabelle erstellen, die enthalten eine Reihe für jeden Tag, den Sie interessieren (sagen Sie 1. Januar 2000 - 31. Dezember 2099):
create table dates (the_date date primary key);
delimiter $$
create procedure populate_dates (p_start_date date, p_end_date date)
begin
declare v_date date;
set v_date = p_start_date;
while v_date <= p_end_date
do
insert ignore into dates (the_date) values (v_date);
set v_Date = date_add(v_date, interval 1 day);
end while;
end $$
delimiter ;
call populate_dates('2000-01-01','2099-12-31');
Dann können Sie eine Abfrage wie folgt ausführen, um Ihre gewünschte Ausgabe zu erhalten:
set @date = curdate();
select dayofweek(the_date) as dayOfWeek, count(*) as numLeft
from dates
where the_date >= @date
and the_date < str_to_date(period_add(date_format(@date,'%Y%m'),1),'%Y%m')
group by dayofweek(the_date);
, dass die Tage der Woche ausschließt, die 0 Vorkommen links im Monat haben. Wenn Sie diejenigen sehen möchten, können Sie eine weitere Tabelle mit den Tagen der Woche (1-7) erstellen:
create table days_of_week (
id tinyint unsigned not null primary key,
name char(10) not null
);
insert into days_of_week (id,name) values (1,'Sunday'),(2,'Monday'),
(3,'Tuesday'),(4,'Wednesday'),(5,'Thursday'),(6,'Friday'),(7,'Saturday');
Und Abfrage, die Tabelle mit einem LEFT JOIN zum Daten Tabelle:
select w.id, count(d.the_Date) as numLeft
from days_of_week w
left outer join dates d on w.id = dayofweek(d.the_date)
and d.the_date >= @date
and d.the_date < str_to_date(period_add(date_format(@date,'%Y%m'),1),'%Y%m')
group by w.id;
Dies erfordert eine ernsthafte Änderung, um mit anderen Tagen der Woche zu arbeiten, und es wäre ziemlich umständlich, eine Version zu erstellen, die die gewünschte Ausgabe zurückgibt. –
es ist nicht enthalten heute ich denke, dies zu tun, müssen Sie +1 hinzufügen, bevor Sie durch 7 teilen –
und ich weiß nicht, wie dies in einer Abfrage zu tun, vielleicht um es in Funktion zu bringen und rufen Sie, müssen Sie die ändern '9' zum Parameter –