2010-08-17 9 views
5

Wie berechnen Sie am einfachsten, wie viele z. Montags ist in einem Monat mit MySQL (heute zählen) verlassen?Anzahl von z.B. Montags im Monat verlassen

Bonuspunkte für eine Lösung, die es für alle Tage der Woche in einer Abfrage löst.

Gewünschte Ausgabe (laufen am Dienstag, 17. August 2010):

dayOfWeek left 
1   2  -- Sunday 
2   2  -- Monday 
3   3  -- Tuesday (yep, including today) 
4   2  -- Wednesday 
5   2  -- Thursday 
6   2  -- Friday 
7   2  -- Saturday 

Antwort

1

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; 
1

ich etwas

nach diesem Artikel

gefunden

http://www.gizmola.com/blog/archives/99-Finding-Next-Monday-using-MySQL-Dates.html

SELECT DATE_ADD(CURDATE(), INTERVAL (9 - IF(DAYOFWEEK(CURDATE())=1, 8, 
DAYOFWEEK(CURDATE()))) DAY) AS NEXTMONDAY; 
"nächsten Montag finden" Was wir tun müssen, ist die Tage zwischen Endmonat und Ne zu berechnen xt Montag, und in 7 teilen.

Update (einschließlich aktuellen Tages):

so das Ergebnis ist wie:

für Montag

 SELECT CEIL(((DATEDIFF(LAST_DAY(NOW()),DATE_ADD(CURDATE(), 
INTERVAL (9 - IF(DAYOFWEEK(CURDATE())=1, 8, DAYOFWEEK(CURDATE()))) DAY)))+1)/7) 
    + IF(DAYOFWEEK(CURDATE())=2,1,0) 

für Dienstag:

SELECT CEIL(((DATEDIFF(LAST_DAY(NOW()),DATE_ADD(CURDATE(), 
INTERVAL (10 - IF(DAYOFWEEK(CURDATE())=1, 8, DAYOFWEEK(CURDATE()))) DAY)))+1)/7) 
    + IF(DAYOFWEEK(CURDATE())=3,1,0) 
+0

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. –

+0

es ist nicht enthalten heute ich denke, dies zu tun, müssen Sie +1 hinzufügen, bevor Sie durch 7 teilen –

+0

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 –

0

Sehen Sie sich meine Antworten an.

MySQL: Using the dates in a between condition for the results

und

Select all months within given date span, including the ones with 0 values

für eine Art, wie ich glaube, gut funktionieren würde, ähnlich wie @ Walker oben, jedoch ohne dass die dayofweek() Funktion in der Abfrage zu tun, und möglicherweise auch flexibler. Eine der Antworten hat eine Verbindung zu einem SQL-Dump meiner Tabelle, die importiert werden kann, wenn es hilft!

Verwandte Themen