2011-01-13 22 views
38

Questo sembra stupido ma, ho semplicemente bisogno di un elenco di date da ordinare con la data più recente in cima. L'utilizzo di order by DESC non sembra funzionare nel modo in cui lo desidero.Ordine in ordine decrescente - mese, giorno e anno

SELECT  * 
FROM   vw_view 
ORDER BY EventDate DESC 

Mi dà la data ordinata per mese e giorno, ma non prende in considerazione l'anno. per esempio:

12/31/2009 

12/31/2008 

12/30/2009 

12/29/2009 

ha bisogno di essere più simile a:

12/31/2009 

12/30/2009 

12/29/2009 

12/28/2009 

e così via.

+3

Qual è il tipo di dati della colonna 'EventDate'? –

+2

E il tipo di DB sarebbe bello anche –

+2

Perché non aggiornare la progettazione della tabella e renderla corretta, utilizzando un campo data?! Utilizzare soluzioni alternative per un design scadente non è un buon percorso. –

risposta

53

Sto indovinando EventDate è un char o varchar e non una data altrimenti il ​​tuo ordine per clausola andrebbe bene.

È possibile utilizzare CONVERT per modificare i valori di una data e ordina per che

SELECT * 
FROM 
    vw_view 
ORDER BY 
    CONVERT(DateTime, EventDate,101) DESC 

Il problema è che, come sottolinea Sparky nei commenti, se EventDate ha un valore che non può essere convertito in una data la query non verrà eseguita.

Questo significa che si dovrebbe neanche escludere le cattive righe o lasciare che i cattivi righe andare al fondo dei risultati

Per escludere i cattivi righe basta aggiungere WHERE IsDate(EventDate) = 1

Per lasciare lasciare che le date cattivi vanno al in basso è necessario utilizzare CASE

ad es.

ORDER BY 
    CASE 
     WHEN IsDate(EventDate) = 1 THEN CONVERT(DateTime, EventDate,101) 
     ELSE null 
    END DESC 
+0

questo funziona perfettamente, grazie! hai avuto ragione nell'assumere che sia sql server e EventDate sia impostato come varchar – user570457

+0

@ user570457. Nessun problema. Ho aggiornato i tag per includere SQL-Server. È una buona idea includerlo nella prossima domanda. –

+2

Un avvertimento, se una delle date non è valida, SQL restituirà un errore sulla conversione, rendendo la tua query non valida. Può essere frustrante dal momento che devi capire quale data sta causando il problema. È possibile utilizzare IsDate() = 0 per vedere se si dispone di date non valide per preoccuparsi di – Sparky

17

Prova: (. Dagli utenti anonimi)

ORDER BY MONTH(Date),DAY(DATE) 

EDIT

credo che questo post è fatto con, tuttavia questo utente sopra ha colpito su qualcosa che ha risolto il mio problema sopra tutti gli altri.

Se qualcuno ha problemi con le altre soluzioni, provare una mod secondaria del codice precedente.

ORDER BY YEAR(Date) DESC, MONTH(Date) DESC, DAY(DATE) DESC 

Questo era il mio approccio finale e ha funzionato perfettamente su un JET DB.

PS. Spero che nessuno stia effettivamente usando Date come il loro nome di campo ;-)

+0

Questo è il risultato che l'OP dice di ottenere e che non vuole! –

+0

lol, sembra che ho interpretato male la domanda e ho ancora ottenuto 2 voti! –

+0

Grazie, risparmi il mio tempo :) –

4

qual è il tipo del campo EventDate, poiché l'ordine non è corretto presumo che non lo si abbia impostato su una data/ora che rappresenta il tipo , ma una stringa. E poi il modo americano di scrivere le date è brutto per ordinare

+0

chi ha impostato questo ha avuto l'EventDate impostato come un varchar per qualche motivo:/ – user570457

3

Se hai ristrutturato il formato della data in AAAA/MM/GG, allora puoi usare questo semplice ordinamento di stringhe per ottenere la formattazione di cui hai bisogno.

In alternativa, utilizzando il comando SUBSTR(store_name,start,length) si dovrebbe essere in grado di ristrutturare il termine di smistamento nel formato sopra

magari utilizzando il seguente

SELECT  * 
FROM   vw_view 
ORDER BY SUBSTR(EventDate,6,4) + SUBSTR(EventDate, 0, 5) DESC 
6

avete il campo in una stringa, quindi avrai bisogno di convertirlo in datetime

order by CONVERT(datetime, EventDate) desc 
3

Supponendo di avere il potere di fare modifiche dello schema l'unica risposta accettabile a questa domanda IMO è quello di cambiare il tipo di dati di base in qualcosa di più appropriato (ad es. date se SQL Server 2008).

La memorizzazione delle date come mm/dd/yyyy stringhe è spazio inefficiente, difficile da convalidare correttamente e rende inutili dolcissimi calcoli di ordinamento e data.

Problemi correlati