2016-08-31 1 views
1

ich eine Tabelle zählen bekommen haben (Name VCAR)wählen Sie ein Datum im Bereich zwischen zwei Daten in und

id | createddatetime | 
-------------------------- 
1 |2016-08-20 17:23:53 | 
2 |2016-08-20 17:23:53 | 
3 |2016-08-20 17:23:53 | 
4 |2016-08-20 17:23:53 | 
4 |2016-08-20 17:23:53 | 
4 |2016-08-21 17:23:53 | 
3 |2016-08-21 17:23:53 | 
1 |2016-08-21 17:23:53 | 
1 |2016-08-21 17:23:53 | 
2 |2016-08-24 17:23:53 | 
3 |2016-08-24 17:23:53 | 
4 |2016-08-24 17:23:53 | 
2 |2016-08-29 17:23:53 | 
2 |2016-08-29 17:23:53 | 
3 |2016-08-29 17:23:53 | 
4 |2016-08-29 17:23:53 | 
4 |2016-08-30 17:23:53 | 
2 |2016-08-30 17:23:53 | 
3 |2016-08-30 17:23:53 | 
4 |2016-08-30 17:23:53 | 

Ich versuche, die Anzahl der IDs in einem bestimmten Datumsbereich zu erhalten mit

SELECT 
count(CAST(createddatetime AS DATE)), 
CAST(createddatetime AS DATE), 
DAYNAME(CAST(createddatetime AS DATE)) 
FROM vcar 
WHERE 
CAST(createddatetime AS DATE)>=date('2016-08-20') AND 
CAST(createddatetime AS DATE)<=date('2016-08-35') 
GROUP BY CAST(createddatetime AS DATE); 

das gibt mir das o/p, aber ich muss auch Daten zeigen, die an einem bestimmten Tag null Treffer hat. Wie kann das gemacht werden?

O/p Ich erhalte

-------------------------------------- ------------------------------- ---------------------------------------- 

    count(CAST(createddatetime AS DATE)) | CAST(createddatetime AS DATE) | DAYNAME(CAST(createddatetime AS DATE)) | 

     -------------------------------------- ------------------------------- ---------------------------------------- 
              9 | 2016-08-20     | Saturday        | 
              36 | 2016-08-23     | Tuesday        | 
              4 | 2016-08-24     | Wednesday        | 
     -------------------------------------- ------------------------------- ---------------------------------------- 

Was ich

-------------------------------------- ------------------------------- ---------------------------------------- 
count(CAST(createddatetime AS DATE)) | CAST(createddatetime AS DATE) | DAYNAME(CAST(createddatetime AS DATE)) | 
-------------------------------------- ------------------------------- ---------------------------------------- 
            9 | 2016-08-20     | Saturday        | 
            0 | 2016-08-21     | Sunday         | 
            0 | 2016-08-22     | Monday         | 
            36 | 2016-08-23     | Tuesday        | 
            4 | 2016-08-24     | Wednesday        | 
            9 | 2016-08-25     | Thursday        | 
            0 | 2016-08-26     | Friday         |       
-------------------------------------- ------------------------------- ---------------------------------------- 
+1

Sie bitte Ihre erwartete Ausgabe hinzufügen. – 1000111

+0

@ 1000111 Ill hinzufügen –

+0

Möglicherweise müssen Sie eine Kalendertabelle verwenden, um die Null Treffer Tage zu erhalten, vorausgesetzt, diese Tage erscheinen nicht in Ihrer Tabelle. –

Antwort

2

Ein Kalender-Tabelle so viel einfacher machen würde müssen. Da Sie keine haben, würde die folgende Abfrage die Aufgabe erledigen.

SELECT 
dateTable.day, 
DAYNAME(dateTable.day) AS dayName, 
COALESCE(yourQuery.total,0) AS cnt 
FROM 
(
    SELECT ADDDATE('2016-08-20', INTERVAL @i:[email protected]+1 DAY) AS DAY 
    FROM (
    SELECT a.a 
    FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b 
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c 
    ) a 
    JOIN (SELECT @i := -1) r1 
    WHERE 
    @i < DATEDIFF('2016-08-31', '2016-08-20') 
) AS dateTable 
LEFT JOIN 
(
    SELECT 
     DATE(createddatetime) date, 
     count(id) As total 
    FROM vcar 
    WHERE DATE(createddatetime) BETWEEN '2016-08-20' AND '2016-08-31' 
    GROUP BY date 
) AS yourQuery 
ON dateTable.day = yourQuery.date 
ORDER BY dateTable.day 

Hinweis:

Die Abfrage innerhalb der dateTable alias wird stammt aus 2016-08-20 zu 2016-08-31 erzeugen.

Check this

+0

, wenn ich den Datumsbereich von 2016-08-20 bis 2016-09-31 ändere es gibt mir leeren Satz –

+0

Bereiche müssen in der Abfrage innerhalb der 'dateTable' Alias ​​auch geändert werden. – 1000111

+0

Ich änderte 2016-08-31 zu 2016-09-31, die mir leeren Satz gibt –

Verwandte Themen