Mysql: выбор всех данных между двумя датами
У меня есть таблица mysql с данными, связанными с датами. Каждая строка имеет данные и дату, например:
2009-06-25 75
2009-07-01 100
2009-07-02 120
У меня есть запрос mysql, который выбирает все данные между двумя датами. Это запрос:
SELECT data FROM tbl WHERE date BETWEEN date1 AND date2
Моя проблема в том, что мне также нужно получить строки между date1 и date2, даже если в течение дня нет данных.
Таким образом, мой запрос пропустит даты, которые были пустыми между 2009-06-25 и 2009-07-01.
Могу ли я каким-то образом добавить эти даты только с 0 в качестве данных?
Ответы
Ответ 1
Вы можете использовать концепцию, которая часто упоминается как "таблицы календаря". Здесь - хорошее руководство по созданию таблиц календаря в 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';
Возможно, вы захотите создать таблицу cal
вместо подзапроса.
Ответ 2
Select * from emp where joindate between date1 and date2;
Но этот запрос не показывает правильные данные.
Например,
1-jan-2013 to 12-jan-2013.
Но он показывает данные
1-jan-2013 to 11-jan-2013.
Ответ 3
его очень легко справиться с этой ситуацией
Вы можете использовать МЕЖДУНАРОДНЫЙ CLAUSE в сочетании с date_sub (now(), INTERVAL 30 DAY)
И СЕЙЧАС()
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( )**
Счастливое кодирование:)
Ответ 4
У вас есть таблица со всеми датами? Если нет, вы можете рассмотреть возможность внедрения таблицы календаря и смещения ваших данных в таблицу календаря.
Ответ 5
ЕСЛИ ВЫ МОЖЕТЕ ИЗБЕЖАТЬ ЭТО. НЕ ДЕЛАЙТЕ ЭТО
Базы данных на самом деле не предназначены для этого, вы фактически пытаетесь создать данные (хотя и список дат) в запросе.
Для тех, у кого есть уровень приложения над запросом БД, самым простым решением является заполнение пустых данных.
Вы, скорее всего, будете циклически проходить через результаты запроса и можете реализовать что-то вроде этого:
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
}
Преимущества этого - снижение передачи данных; проще, проще отлаживать запросы; и не беспокойтесь о переполнении таблицы календаря.
Ответ 6
вы должны добавить 1 день до даты окончания, используя: DATE_ADD('$end_date', INTERVAL 1 DAY)
Ответ 7
Вы можете использовать в качестве альтернативного решения:
SELECT * FROM TABLE_NAME WHERE 'date' >= '1-jan-2013'
OR 'date' <= '12-jan-2013'