2011-02-22 9 views
10

Simplemente necesito devolver una lista de todos los días dentro de un mes. No estoy accediendo a una tabla específica. Así que necesito una instrucción de selección SQL si se les da el mes de febrero de devolver el siguiente:mysql seleccionar fechas sin tablas

Day 
---- 
2011-02-01 
2011-02-02 
2011-02-03 
... etc, etc. 
2011-02-27 
2011-02-28 

Esto debería ser bastante simple, yo creo, si supiera el SQL instrucción de selección Necesito hacer. El mes debe ser seleccionable, lo pasaré de un cuadro de selección de página web que permite al usuario seleccionar el mes y el año. Esta será la base de un informe. Ya tengo una declaración seleccionada que tomará cada uno de los días y dará los recuentos en los registros relacionados con esas fechas, pero necesito esta tabla como base de mis informes.

+3

si no está accediendo a una mesa, entonces y ¿usa el sql en absoluto? – Val

+0

¿Por qué no hacer esto en su lenguaje de programación? Probablemente sea mucho más simple. – Knubo

+0

Por curiosidad, ¿por qué se debe lograr esto en sql? Parece una solicitud incómoda que se realiza más fácilmente en el lenguaje de scripting de su elección. –

Respuesta

16

Estoy de acuerdo con los comentarios, que algo como esto no debe hacerse en la base de datos, pero técnicamente es posible. Si usted le da la fecha de inicio y fin, la suma de números adicionales para la sub consulta si es necesario:

SELECT '2011-02-01' + INTERVAL a + b DAY dte 
FROM 
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3 
    UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 
    UNION SELECT 8 UNION SELECT 9) d, 
(SELECT 0 b UNION SELECT 10 UNION SELECT 20 
    UNION SELECT 30 UNION SELECT 40) m 
WHERE '2011-02-01' + INTERVAL a + b DAY < '2011-03-01' 
ORDER BY a + b 

Resultados:

"2011-02-01" 
"2011-02-02" 
"2011-02-03" 
.... 
"2011-02-28" 
+0

impresionante, eso es exactamente lo que necesito.Trataré de encontrar una mejor manera de hacer lo que tengo que hacer para estos informes esta noche, pero tengo un cliente conmigo en este momento, que quiere ver el resultado de esta declaración selecta – stephenbayer

+2

que funciona muy bien, lo haré ponga en otra pregunta con más detalles para ver si alguien tiene una mejor manera de hacerlo, pero el generador de informes que uso toma una sola cadena de consulta SQL, y devuelve una tabla html, así que realmente no puedo recorrerla por cada día y hacer múltiples consultas en mi lenguaje de scripting. Debo contener todo en una sola consulta SQL. – stephenbayer

+0

Pero esta impresión solo valores distintos, ¿cómo puedo imprimir todos los valores? – saravanakumar

0

- Esto puede ser excesiva, pero se puede hacer un procedimiento como éste :

use dbname; 

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `days_of_month` $$ 

CREATE PROCEDURE `days_of_month`(iDate DATETIME) DETERMINISTIC 

BEGIN 

    DECLARE last_day,mm,yy,dd INT DEFAULT 0; 
    SET dd = 1; 
    SET mm = month(iDate); 
    SET yy = year(iDate); 

    set iDate = case when iDate is null then now() else iDate end; 
    SET last_day = date_format(LAST_DAY(iDate),'%d'); 

    DROP TABLE IF EXISTS `days_of_month_tblTemp`; 
    CREATE TEMPORARY TABLE days_of_month_tblTemp(tmpDate DATE); 

    label1: LOOP 
     insert into days_of_month_tblTemp(tmpDate) values (concat(yy,'-',mm,'-',dd)); 
     SET dd = dd + 1; 
     IF dd < (last_day+1) THEN ITERATE label1; END IF; 
     LEAVE label1; 
     END LOOP label1; 
     SELECT * from days_of_month_tblTemp; 
END $$ 

DELIMITER ; 

- ejecútelo así: CALL days_of_month ('2012-02-22');

0

He aumentado ligeramente para dar las todas las fechas anteriores, por el último mes:

SELECT (selección de fecha (NOW() - INTERVALO DE 1 MES)) + INTERVALO a + b DÍA DTE DE (SELECT 0 un UNION SELECT 1 un UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d, (SELECCIONAR 0 b UNION SELECT 10 UNION SELECT 20 UNION SELECT 30 UNION SELECCIONAR 40) m DÓNDE (SELECCIONAR Fecha (AHORA() - INTERVALO 1 MES)) + INTERVALO a + b DÍA < (seleccione la fecha (ahora())) ORDER BY a + b;

+0

Es posible que desee desglosar esto y proporcionar ejemplos de entrada y salida. – Lizz