2009-07-14 20 views

Antwort

29

Entweder Redesign der Spalte wie von Williham Totland vorgeschlagen, oder einige String-Parsing, um eine Datumsdarstellung zu erhalten.

Wenn die Spalte nur den Wochentag enthält, dann können Sie dies tun:

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

Montag zuerst. ;) –

+1

Wie Sie sehen können, habe ich sehr genau auf die Bestellung selbst geachtet :( –

+1

Kann für die meisten offensichtlich sein, aber tippen Sie nicht <> bei der Eingabe des Feldnamens. –

3

Ich denke, dass kurz vor der Neugestaltung der Spalte, um ein Enum stattdessen verwenden, gibt es nicht viel zu tun, abgesehen von der Sortierung der Ergebnisse, nachdem Sie sie erhalten haben.

Edit: Ein Dirty Hack ist natürlich eine andere Tabelle mit ID hinzuzufügen: wochentag Paare und mit Joins oder wählen Sie in wählt eine gefälschte enum.

+0

Traurig, aber wahr. +1 – Abinadi

0

Eine andere Art und Weise mit jenen Tagen eine andere Tabelle zu erstellen wäre und ein int ihnen durch, um zu bestellen, an, dass Tabelle bei der Suche und Reihenfolge von ihm. Natürlich wird das Hinzufügen zu einem Varchar nicht empfohlen.

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

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

(Entschuldigt, wenn das nicht richtig ist, ich habe vor kurzem mit SQL Server aufgeklebt)

Noch einmal, dies wird NICHT empfohlen, aber wenn Sie die Daten, die Sie bereits haben, nicht ändern können ... Dies funktioniert auch, wenn nicht-Standard-Werte im Feld DayColumn sind.

1

Das sieht chaotisch, aber immer noch funktioniert und scheint mehr generic:

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; 

verwenden, wenn noch mehr Generika und Messier ist:

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; 

Sie können auch ausblenden, um die Details der Umwandlung von Namen in int in der gespeicherten Prozedur.

0

... ORDER BY Datum_Format (order_date, '% w') = 0, Datum_Format (order_date, '% w');

0

Ich realisiere, dass dies ein alter Thread ist, aber da es an die Spitze von Google für bestimmte Suchzeiten kommt, werde ich es verwenden, um meinen Ansatz zu teilen.

Ich wollte das gleiche Ergebnis wie die ursprüngliche Frage, aber zusätzlich wollte ich die Reihenfolge der Ergebnisse ab dem aktuellen Tag der Woche und dann durch den Rest der Tage.

Ich erstellte eine separate Tabelle, in der die Tage über zwei Wochen aufgelistet wurden, so dass egal, an welchem ​​Tag Sie begannen, Sie eine Folge von 7 Tagen durchlaufen konnten.

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

Ich lief dann die Abfrage mit einer Variablen, die den Startpunkt in der Reihenfolge bestimmt und verwendet eine der Bestellnummer für die nächsten Tage zu bekommen beizutreten.Zum Beispiel die Auflistung am Mittwoch zu beginnen, ich folgendes:

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; 

Ich hoffe, das jemand, der auf diesen Beitrag stolpert hilft.

6

Warum nicht das?

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

Ich glaube, diese Aufträge Montag bis Sonntag ...

+1

Upvoted, weil dies für mein Projekt funktioniert, aber denken Sie daran, dies sollte 1 sein THEN 7. – BClaydon

-1

Wenn Sie dies versuchen, sollte es funktionieren:

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

einen anderen Weg gefunden, die für mich funktioniert:

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

Hoffe es hilft