rango - Mysql: selecciona todos los datos entre dos fechas
generar rango de fechas sql (7)
¿Tienes una mesa 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.
Tengo una tabla mysql con datos conectados a las fechas. Cada fila tiene datos y una fecha, como esta:
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 también necesito obtener las filas entre date1 y date2, 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.
¿Puedo de alguna manera agregar estas fechas con solo 0 como datos?
Puede usar como una solución alternativa :
SELECT * FROM TABLE_NAME WHERE `date` >= ''1-jan-2013''
OR `date` <= ''12-jan-2013''
Puede usar un concepto al que frecuentemente se hace referencia como ''tablas de calendario''. Here hay 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 tabla cal
lugar de la subselección.
debe agregar 1 día a la fecha de finalización, usando: DATE_ADD(''$end_date'', INTERVAL 1 DAY)
es muy fácil de manejar esta situación
Puede usar BETWEEN CLAUSE en combinación con date_sub (now (), INTERVAL 30 DAY) Y NOW ()
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( )**
Happy Coding :)
SI PUEDES EVITARLO ... NO LO HAGAS
En realidad, las bases de datos no están diseñadas para esto; de hecho, intentas crear datos (aunque sea una lista de fechas) dentro de una consulta.
Para cualquiera que tenga una capa de aplicación sobre la consulta DB, la solución más simple es completar allí los datos en blanco.
Lo más probable es que recorra los resultados de la consulta de todos modos y pueda 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 transmisión de datos reducida; más simples, más fáciles de depurar consultas; y no te preocupes por sobrepasar la tabla del calendario.
Select * from emp where joindate between date1 and date2;
Pero esta consulta no muestra los datos adecuados.
P.ej
1-jan-2013 to 12-jan-2013.
Pero son datos del show
1-jan-2013 to 11-jan-2013.