2012-02-08 16 views
8

Voglio interrogare tutti i prodotti venduti negli ultimi 5 anni.
E 'possibile farlo in questo modo:Richiesta degli ultimi 5 anni

select * from products 
where time between sysdate-1826 and sysdate 

Ma c'è anche un modo più bello invece di calcolare tutti i giorni e sottrarre da sysdate?

+0

Questo è indirettamente indirizzato dalla risposta di @ JustinCave, ma 1826 giorni non equivale costantemente a 5 anni (un periodo di 5 anni può contenere 1 o 2 anni bisestili). Ecco perché è meglio usare operatori che si occupano di mesi interi o anni (che sono coerenti). – Allan

risposta

17
SELECT * 
    FROM products 
WHERE date_column >= add_months(sysdate, -12*5) 

o

SELECT * 
    FROM products 
WHERE date_column >= sysdate - interval '5' year 

saranno entrambi vi darà tutte le righe degli ultimi 5 anni (anche se si dovrebbe generalmente voler aggiungere a TRUNC per rimuovere la parte relativa all'ora a meno che non ti interessi davvero se una riga è stata creata l'8 febbraio 2007 al mattino o al pomeriggio).

+1

Nota relativa al secondo esempio: l'aritmetica dell'intervallo aumenterà" ORA-01839: data non valida per il mese specificato "se sysdate è un giorno bisestile. –

0
select * from products 
where time > DATE_SUB(NOW(), INTERVAL 5 YEAR) 

Data sub sottrarrà 5 anni da oggi

+1

è su Oracle, non funzionerà con date_sub e ora() –

+2

@James L - DATE_SUB non è una funzione disponibile in Oracle. Credo che sia una funzione di SQL Server. –

+0

Grazie, ma ricevo il seguente errore 'mancante parentesi destra'. Poi ho trovato questo: [date_sub() dando errore] (https://forums.oracle.com/forums/thread.jspa?threadID=2171098) e questa era la soluzione: 'dove tempo> SYSDATE - INTERVAL '5' ANNO ' –

Problemi correlati