2010-04-21 6 views
10

Ich versuche, die Bestellung Gesamtsumme ($) und Rechnung zählen über einen Zeitraum von 5 Tagen in einer einzigen Abfrage. Ich kann das anscheinend nicht passieren. Die aktuelle Abfrage Ich habe hier ...MySQL DATE_ADD Nutzung, 5-Tages-Intervall

SELECT 
    COUNT(id) as invoice_count, 
    SUM(orderTotal) as orders_sum, 
    UNIX_TIMESTAMP(created) as created 
FROM ids_invoice 
WHERE DATE_ADD(created, INTERVAL +1 DAY) 
AND userId = 23 LIMIT 5' 

Ich bin nicht ganz sicher DATE_ADD ist die richtige Funktion, die ich suche.

Derzeit erhalte ich ....

Array ( 
    [0] => Array ( 
     [invoice_count] => 420 
     [orders_total] => 97902.90 
     [created] => 1252596560 
    ) 
) 

Array ( 
    [0] => Array ( 
     [invoice_count] => 68 
     [orders_total] => 14193.20 
     [created] => 1262900809 
    ) 
) 

Ich mag würde, etwas mehr zu bekommen wie ...

Array ( 
    [0] => Array ( 
     [invoice_count] => 18 
     [orders_total] => 4902.90 
     [date] => 04-19-2010 
    ) 
) 

Array ( 
    [0] => Array ( 
     [invoice_count] => 12 
     [orders_total] => 5193.20 
     [date] => 04-20-2010 
    ) 
) 

Ich bin ziemlich neu in MySQL Datumsfunktionen so vielleicht Ich habe gerade die Funktion verpasst, die ich brauchte, wenn ich mysql-Dokumente durchging.

UPDATE Ich habe meine Abfrage aktualisiert ... Dies zieht immer noch keine Zeile für jeden Tag, für den es Rechnungen gab. Es werden nur Rechnungen ab dem 19. abgerufen, wenn Rechnungen vom 20. die userId-Kriterien erfüllen.

SELECT 
    COUNT(id) as invoice_count, 
    SUM(orderTotal) as orders_sum, 
    UNIX_TIMESTAMP(created) as created 
FROM ids_invoice 
WHERE 
    created BETWEEN "2010-04-19 00:00:00" AND DATE_ADD("2010-04-19 00:00:00", INTERVAL +5 DAY) AND 
    userId = 17 

Antwort

17

Um Datensätze zwischen einem Zeitraum zu erhalten, verwenden Sie:

WHERE created BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 5 DAY) 

Dieses Beispiel wird erhalten Sie Aufzeichnungen (unter der Annahme, dass für heute, einschließlich der Zeit existieren) für zwischen heute und Tagen in die Zukunft. Schau dir DATE_SUB an, wenn du in die Vergangenheit gehen willst.

+0

Ist es möglich für mich, Standardwerte für alle Zahlen zu erhalten, die innerhalb des angegebenen Zeitraums nicht existieren? – Webnet

+0

@Webnet: Sie benötigen eine Liste von Datumsangaben, die den gewünschten Bereich überspannen, um JOIN in die Tabelle "IDS_INVOICE" zu verlagern, basierend auf dem Datum und dem 'created' Wert. MySQL hat keine rekursive Unterabfrage - Sie können eine Zahlentabelle erstellen oder eine CROSS JOIN-Konfiguration verwenden, um die benötigte Datumsberechnung zu erhalten. –

+0

Ich verstehe die Logik von dem, was Sie sagen, es macht vollkommen Sinn. Sie sagen, dass ich 'SELECT COUNT (ID) als invoice_count FROM ids_invoice LEFT JOIN ids_invoice WHERE erstellt ZWISCHEN JETZT() UND DATUM_ADD (JETZT(), INTERVALL 5 TAG)' Ich bin mir sicher, dass es offensichtlich ist .... aber ich bin mir nicht sicher über die Syntax dessen, worüber du sprichst. – Webnet

0
WHERE created <= NOW() AND created >=NOW() - INTERVAL 5 DAY 

oder wäre es besser, nur DATE Teil Datumzeit vergleichen:

WHERE DATE(created) <= date(NOW()) AND 
    DATE(created) >= DATE(NOW() - INTERVAL 5 DAY) 
2

Wenn Ihr erstellt Spalte Typ int ist dann nur versuchen, diese ein

created<= UNIX_TIMESTAMP(DATE_ADD(CURDATE(),INTERVAL 5 DAY))')