2009-07-03 17 views
44

Mam tabelę mysql z danymi związanymi z datami. Każdy wiersz zawiera dane i datę, na przykład:Mysql: Wybierz wszystkie dane między dwiema datami

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

Mam zapytanie mysql, które wybiera wszystkie dane między dwiema datami. Jest to zapytanie:

SELECT data FROM tbl WHERE date BETWEEN date1 AND date2

Moim problemem jest to, że również trzeba uzyskać wiersze między data1 i data2 nawet jeśli nie ma żadnych danych na dzień.

Tak więc w moim zapytaniu pominięto daty, które są puste między 2009-06-25 a 2009-07-01.

Czy mogę w jakiś sposób dodać te daty tylko jako dane?

Odpowiedz

4

Czy masz tabelę, która ma wszystkie daty? Jeśli nie, możesz rozważyć wdrożenie tabeli kalendarza i pozostawienie łączenia swoich danych z tabelą kalendarza.

38

Możesz użyć koncepcji, która jest często określana jako "tabele kalendarza". Here jest dobrym przewodnikiem, w jaki sposób tworzyć tabele w MySQL kalendarza:

-- 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'; 

Może chcesz utworzyć tabelę cal zamiast podselekcji.

+0

Josef: Myślę, że chodziło http://www.artfulsoftware.com/infotree/queries.php?&bw=1504#95 – feihtthief

+4

adresy URL są dokładnie takie same, nie? –

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

Ale to zapytanie nie wyświetla właściwych danych.

Np

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

Ale to pokazują dane

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

Użyłem tego i było to dokładne, ponieważ moje pola dat są typu DATETIME, więc wprowadzam wartości (dla danych w ciągu dnia) w następujący sposób: 'BETWEEN '2013-10-12 00:00:00' i '2013-10 -12 23: 59: 59'' pracował! Dziękuję Panu. – arrayown

+1

@gulab, Możesz użyć 'SELECT * FROM emp WHERE DATE (joindate) MIĘDZY date1 AND date2;' – shweta

10

bardzo łatwo obsługiwać tę sytuację

Można użyć MIĘDZY CLAUSE w połączeniu z date_sub (teraz() , INTERVAL 30 DAY) I TERAZ()

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()** 

Szczęśliwy Coding :)

1

jeśli możesz uniknąć .. Nie rób tego

Bazy danych nie są naprawdę zaprojektowane do tego, jesteś skutecznie stara się stworzyć dane (aczkolwiek lista dat) w zapytaniu.

Dla każdego, kto ma warstwę aplikacji powyżej zapytania DB, najprostszym rozwiązaniem jest wypełnienie pustych danych.

Będziesz bardziej niż prawdopodobne, być zapętlenie poprzez wyniki kwerendy i tak można zaimplementować coś takiego:

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 
} 

Korzyści z tego są zmniejszone do transmisji danych; prostsze i łatwiejsze do debugowania zapytania; i nie martw się przepełnieniem stołu kalendarza.

1

należy dodać 1 dnia do daty końcowej, przy użyciu: DATE_ADD('$end_date', INTERVAL 1 DAY)

Powiązane problemy