2010-08-17 15 views
5

¿Cómo calculo más fácilmente cuántos e.g. Los lunes se dejan en un mes usando MySQL (contando hoy)?Número de p. Ej. Los lunes quedan en el mes

Puntos de bonificación por una solución que lo resuelve todos los días de la semana en una consulta.

salida deseada (ejecutar el martes de agosto de 17a 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 

Respuesta

1

Crear una tabla de fecha que contiene una fila por cada día que le interese (entre el 1 de enero de 2000 y el 31 de diciembre de 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'); 

A continuación, puede ejecutar una consulta como esta para obtener su salida deseada:

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

que excluya los días de la semana que tienen 0 sucesos que quedan en el mes. Si desea ver los puede crear otra tabla con los días de la semana (1-7):

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'); 

y Query esa mesa con una izquierda unirse a la mesa de fechas:

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

he encontrado algo

de acuerdo con este artículo "encontrar el próximo lunes"

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; 

lo que tenemos que hacer es calcular los días entre el mes final y el mes xt Lunes, y divida en 7.

actualización (incluya día actual):

por lo que el resultado es como:

para el lunes

 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) 

para el martes:

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

Esto requiere una modificación seria para funcionar con otros días de la semana, y sería bastante engorroso crear una versión que devuelva el resultado deseado. –

+0

no está incluido hoy, creo que para hacer esto necesitas agregar +1 antes de dividir por 7 –

+0

y no sé cómo hacer esto en una consulta, tal vez para ayudarte a ponerlo en funcionamiento y llamarlo, necesitas cambiar el '9' al parámetro –

Cuestiones relacionadas