2010-04-21 4 views
10

Sto tentando di selezionare la somma totale dell'ordine ($) e il conteggio delle fatture su un periodo di 5 giorni in una singola query. Tuttavia, non riesco a capirlo. La query corrente che ho è qui ...Utilizzo DATE_ADD MySQL, intervallo di 5 giorni

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' 

io non sono del tutto sicuro DATE_ADD è la funzione giusta che sto cercando.

Attualmente mi sto ....

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

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

Mi piacerebbe avere qualcosa di più simile ...

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

Sono abbastanza nuovo per funzioni di data mysql quindi forse Ho appena perso la funzione di cui avevo bisogno quando passavo attraverso i documenti mysql.

UPDATE Ho aggiornato la mia domanda ... Questo ancora non tirare una riga per ogni giorno che ci fossero le fatture per. Stanno solo prendendo le fatture dal 19 quando ci sono fatture dal 20 che soddisfano i criteri userId.

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 

risposta

17

Per ottenere i record tra un arco data, l'uso:

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

Questo esempio ottenere i record (supponendo che esistano per oggi, incluso il tempo) tra oggi e giorni nel futuro. Guarda DATE_SUB se vuoi entrare nel passato.

+0

E 'possibile per me per ottenere i valori di default per tutte le figure che non esistono entro i tempi indicati? – Webnet

+0

@Webnet: è necessario un elenco di date che coprono l'intervallo desiderato, a SINISTRA UNISCITI sulla tabella 'IDS_INVOICE' in base alla data e al valore' created'. MySQL non ha subquerying ricorsivo - puoi creare una tabella di numeri, o usare un'impostazione CROSS JOIN per ottenere il calcolo della data che ti serve. –

+0

Capisco la logica di quello che stai dicendo, ha perfettamente senso. Stai dicendo che ho bisogno di 'SELEZIONARE COUNT (id) come conto delle fatture DA ids_invoice LEFT JOIN ids_invoice DOVE CREATO TRA NOW() E DATE_ADD (NOW(), INTERVAL 5 DAY)' Sono sicuro che è ovvio .... ma non sono sicuro della sintassi di ciò di cui stai parlando. – Webnet

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

o sarebbe meglio confrontare solo una parte DATA del datetime:

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

Se il vostro tipo di colonna creata è int poi basta provare questo uno

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