2009-07-14 26 views

risposta

29

O ridisegnare la colonna come suggerito da Williham Totland o eseguire un'analisi delle stringhe per ottenere una rappresentazione della data.

Se la colonna solo contiene il giorno della settimana, allora si potrebbe fare questo:

ORDER BY FIELD(<fieldname>, 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'); 
+5

Lunedì prima. ;) –

+1

Come potete vedere, ho prestato molta attenzione all'ordine stesso :( –

+1

Può essere evidente per la maggior parte, ma non digitare <> quando si digita il nome del campo. –

3

Sto pensando che, a meno di ridisegnare la colonna per usare invece un enum, non c'è molto da fare per questo, oltre a ordinare i risultati dopo averli eliminati.

Modifica: Un attacco informatico è ovviamente quello di aggiungere un'altra tabella con ID: coppie di giorni della settimana e l'utilizzo di join o selezionare in seleziona per simulare un enum.

+0

Triste, ma vero. +1 – Abinadi

0

Un altro modo sarebbe quello di creare un altro tavolo con quei giorni e un int per ordinare loro da, join che tabella durante la ricerca e ordinare da esso. Ovviamente, l'adesione a un varchar non è raccomandata.

Table DaysOfWeek 
id  | day 
-------------------- 
1  | Monday 
2  | Tuesday 
3  | Wednesday 
4  | Thursday 
5  | Friday 
6  | Saturday 

SELECT * FROM WhateverTable LEFT JOIN DaysOfWeek su DaysOFWeek.day = WhateverTable.dayColumn ORDER BY DaysOfWeek.id

(Mi scuso se questo non è corretto; Sono stato bloccato con il server SQL di recente)

Ancora, questo NON è raccomandato, ma se non è possibile modificare i dati che hai già ... Funzionerà anche se ci sono valori non standard nel campo giornoColonna.

1

Questo sembra disordinato, ma ancora funziona e sembra più generico:

select day, 
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 as day_nr from test order by day_nr; 

usando se è ancora più generico e Messier:

select id, day, 
if(day = 'monday',1, 
    if(day = 'tuesday',2, 
    if(day = 'wednesday',3, 
     if(day = 'thursday',4, 
     if(day = 'friday',5, 
      if(day = 'saturday',6,7) 
     ) 
    ) 
    ) 
) 
) as day_nr from test order by day_nr; 

È anche possibile nascondere i dettagli di conversione da nome a int in stored procedure.

0

... ORDINE BY date_format (order_date, '% w') = 0, date_format (order_date, '% w');

0

Mi rendo conto che questo è un thread vecchio, ma come si arriva all'inizio di google per determinati tempi di ricerca lo userò per condividere il mio approccio.

Volevo lo stesso risultato della domanda originale, ma in aggiunta volevo che l'ordine dei risultati iniziasse dal giorno corrente della settimana e poi procedesse per il resto dei giorni.

Ho creato una tabella separata, in cui i giorni sono stati elencati in quindici giorni, in modo che, a prescindere dal giorno in cui hai iniziato, potresti eseguire una sequenza di 7 giorni.

CREATE TABLE IF NOT EXISTS `Weekdays` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ; 

INSERT INTO `Weekdays` (`id`, `name`) VALUES 
(1, 'Monday'), 
(2, 'Tuesday'), 
(3, 'Wednesday'), 
(4, 'Thursday'), 
(5, 'Friday'), 
(6, 'Saturday'), 
(7, 'Sunday'), 
(8, 'Monday'), 
(9, 'Tuesday'), 
(10, 'Wednesday'), 
(11, 'Thursday'), 
(12, 'Friday'), 
(13, 'Saturday'), 
(14, 'Sunday'); 

Allora ho fatto funzionare la query con una variabile che ha determinato il punto di inizio in sequenza e utilizzato un join per ottenere il numero d'ordine per i giorni.Ad esempio, per avviare la quotazione al Mercoledì, faccio la seguente:

SELECT @startnum := MIN(id) FROM Weekdays WHERE name='Wednesday'; 
SELECT * FROM Events INNER JOIN (SELECT id as weekdaynum, name as dayname FROM Weekdays WHERE id>(@startnum-1) AND id<(@startnum+7)) AS s2 ON s2.dayname=Events.day ORDER BY weekdaynum; 

Spero che questo aiuta qualcuno che inciampa su questo post.

6

Perché non questo?

ORDER BY (
    CASE DAYOFWEEK(dateField) 
    WHEN 1 THEN 7 ELSE DAYOFWEEK(dateField) 
    END 
) 

Credo che questo gli ordini Lunedi alla Domenica ...

+1

In aumento perché questo funziona per il mio progetto, ma tenere presente che dovrebbe essere 1 THEN 7. – BClaydon

-1

Se si tenta questo, dovrebbe funzionare:

SELECT ename, TO_CHAR(hiredate, 'fmDay') as "Day" 
FROM my_table 
ORDER BY MOD(TO_CHAR(hiredate, 'D') + 5, 7) 
0

trovato un altro modo che funziona per me:

SELECT LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'fmDAY') as 'Day' FROM EMPLOYEES 
ORDER BY TO_CHAR(HIRE_DATE, 'd');  

Spero che sia utile