2012-04-18 2 views
8

Ho una tabella che contiene giorni e ore, la colonna del giorno, può avere uno qualsiasi dei sette giorni inseriti in esso, e sono impostati sul tipo di dati varchar. Poiché questa tabella contiene i tempi di prenotazione per un cliente, desidero selezionare tutti i giorni dalla tabella in cui l'ID corrisponde e desidero ordinare il giorno dal lunedì al domenica. Speravo che avrei potuto aggiungere qualcosa a questa query per selezionare manualmente l'ordine dei risultati tornare in questo modo:È possibile selezionare un ORDER BY specifico in SQL Server 2008?

select * 
from requirements 
where Family_ID = 1 
ORDER BY Day, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday 

Questo, naturalmente, non funziona, ma ho solo voluto mostrare quello che sto cercando di realizzare. Il cliente non richiede necessariamente aiuto ogni giorno, voglio solo mostrare i giorni in cui sono prenotati.

L'ordinamento per DESC e ASC non aiuta con i giorni della settimana, gradirei eventuali suggerimenti su come raggiungere questo.

Grazie.

+1

Utilizzare la funzione DATEPART (giorno della settimana, @ dtDate)? Ti darebbe i giorni della settimana come numeri –

risposta

26

Hmm .. che è brutto, i giorni vengono memorizzati come "lunedì", "martedì", ecc.

In ogni caso, basta fare questo:

SELECT * 
FROM Requirements 
ORDER BY 
    CASE Day 
    WHEN 'Monday' THEN 1 
    WHEN 'Tuesday' THEN 2 
    WHEN 'Wednesday' THEN 3 
    WHEN 'Thursday' THEN 4 
    WHEN 'Friday' THEN 5 
    WHEN 'Saturday' THEN 6 
    WHEN 'Sunday' THEN 7 
    END 
+0

Ciao, la tua soluzione ha funzionato, grazie mille! Questa è un'altra cosa imparata! Oggi non ho voti, ma quando saranno aggiornati voterò la tua risposta. Posso solo chiedere cosa intendi nel mio modo di fare le cose brutte, ho sentito che non era il modo migliore per farlo. Le gioie di essere un principiante! – deucalion0

+1

Utilizzare DATETIME o utilizzare un numero intero per i giorni della settimana, ad es. 0 = sabato, 1 = lunedì, 2 = martedì, ecc. In questo modo, è possibile ordinare naturalmente il campo: 'ORDER BY DATEPART (WEEKDAY, DateTimeFieldHere)', o questo: 'ORDER BY DateTimeFieldHere' –

+1

Se ri progettare la tabella non è un'opzione per te in questo momento, basta aggiungere una colonna calcolata per quelle "CASE WHENs". In questo modo, puoi ordinare in base a un campo indicizzabile. La colonna calcolata può accelerare l'ordinamento o il filtraggio. per esempio. http://www.mssqltips.com/sqlservertip/1682/using-computed-columns-in-sql-server-with-persisted-values/ http://blog.sqlauthority.com/2010/08/13/sql- server-computed-column-and-performance-part-3/ –

1

IMHO non si ha motivo di memorizzare Monday, Tuesday, etc ... Se si memorizza il valore di data o datetime, si può sempre estrarre il nome nei giorni feriali dalle quei dati al momento della query quando ne hai bisogno - utilizzando DATENAME nella query o utilizzando la funzionalità nel livello di presentazione. Il costo delle prestazioni di farlo non giustifica la memorizzazione separatamente IMHO. E dovresti comunque essere in grado di ordinare correttamente usando i dati di data/datetime nativi.