2009-07-03 16 views
44

Tengo una tabla mysql con datos conectados a las fechas. Cada fila tiene datos y una fecha, como esta:Mysql: seleccione todos los datos entre dos fechas

2009-06-25 75 
2009-07-01 100 
2009-07-02 120 

Tengo una consulta de MySQL que selecciona todos los datos entre dos fechas. Esta es la consulta:

SELECT data FROM tbl WHERE date BETWEEN date1 AND date2

Mi problema es que yo también necesito para obtener las filas entre fecha1 y fecha2 incluso si no hay datos para un día.

Por lo tanto, mi consulta omitiría las fechas que están vacías entre 2009-06-25 y 2009-07-01.

¿Debo de alguna manera agregar estas fechas con solo 0 como datos?

Respuesta

4

¿Tiene una tabla que tiene todas las fechas? De lo contrario, es posible que desee considerar la implementación de una tabla de calendario y dejar unir sus datos en la tabla de calendario.

38

Puede utilizar un concepto que con frecuencia se denomina 'tablas de calendario'. Here es una buena guía sobre cómo crear tablas de calendario en MySQL:

-- create some infrastructure 
CREATE TABLE ints (i INTEGER); 
INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); 

-- only works for 100 days, add more ints joins for more 
SELECT cal.date, tbl.data 
FROM (
    SELECT '2009-06-25' + INTERVAL a.i * 10 + b.i DAY as date 
    FROM ints a JOIN ints b 
    ORDER BY a.i * 10 + b.i 
) cal LEFT JOIN tbl ON cal.date = tbl.date 
WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01'; 

Es posible que desee crear la tabla cal en lugar de la subselección.

+0

Josef: Creo que quería decir http://www.artfulsoftware.com/infotree/queries.php?&bw=1504#95 – feihtthief

+4

las URLs son exactamente lo mismo, ¿no? –

12
Select * from emp where joindate between date1 and date2; 

Pero esta consulta no muestra datos correctos.

Ej

1-jan-2013 to 12-jan-2013. 

pero es la demostración de datos

1-jan-2013 to 11-jan-2013. 
+2

Lo usé y era preciso porque mis campos de fecha son del tipo DATETIME, por lo que los valores (para datos dentro de un día) como este: 'BETWEEN '2013-10-12 00:00:00' y '2013-10 -12 23: 59: 59'' funcionó! Gracias Señor. – arrayown

+1

@gulab, puede usar 'SELECT * FROM emp WHERE DATE (joindate) ENTRE date1 Y date2;' – shweta

10

es muy fácil de manejar esta situación

Puede utilizar entre el artículo en combinación con DATE_SUB (ahora() , INTERVALO 30 DÍAS) Y AHORA()

SELECT 
    sc_cust_design.design_id as id, 
    sc_cust_design.main_image, 
    FROM 
    sc_cust_design 
WHERE 
    sc_cust_design.publish = 1 
    AND **`datein`BETWEEN date_sub(now() , INTERVAL 30 DAY) AND NOW()** 

feliz :) Codificación

1

si se puede evitar TI .. no lo hagas

bases de datos no están realmente diseñados para esto, se están tratando con eficacia para crear datos (aunque una lista de fechas) dentro de una consulta.

Para cualquiera que tenga una capa de aplicación encima de la consulta DB, la solución más simple es completar allí los datos en blanco.

usted más que probable que sea un bucle a través de los resultados de la consulta de todos modos y se puede implementar algo como esto:

loop_date = start_date 

while (loop_date <= end_date){ 

    if(loop_date in db_data) { 
    output db_data for loop_date 
    } 
    else { 
    output default_data for loop_date 
    } 

    loop_date = loop_date + 1 day 
} 

Los beneficios de esto son la disminución de transmisión de datos; más simples, más fáciles de depurar consultas; y no te preocupes por sobrepasar la tabla del calendario.

1

debe agregar 1 día a la fecha de finalización, usando: DATE_ADD('$end_date', INTERVAL 1 DAY)

Cuestiones relacionadas