Подтвердить что ты не робот

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 в качестве данных?

4b9b3361

Ответ 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'