12


7

曜日名を含むvarcharカラムでmysqlの結果を並べ替えるにはどうすればいいですか?

月曜日は日曜日ではなく、最初に指定する必要があります。

9 Answer


31


Williham Totlandの提案に従って列を再設計するか、日付表現を取得するために文字列解析を実行します。

_only_列に曜日が含まれている場合は、次のようにします。

フィールド別注文(、「月」、「火曜日」、「水曜日」、「木曜日」、「金曜日」、「土曜日」、「日曜日」);


6


なんでこれじゃないの?

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

私はこれが月曜日から日曜日までの注文を信じています…​


3


代わりに列挙型を使用するように列を再設計することを除いて、結果をソートした後に並べ替える以外に、実行することは多くはありません。

編集:汚いハックはもちろんID:平日のペアで別のテーブルを追加し、結合を使用してまたは列挙型を偽造するために選択で選択することです。


1


これは厄介に見えますが、それでも機能し、より一般的に見えます。

選択日、月曜日の場合は日、火曜日の場合は1、水曜日の場合は2、金曜日の場合は4、金曜日の場合は4、土曜日の場合は6、日曜日の場合は6、日曜日の場合は7です。 day_nrによるテスト順序から。

ifの使用はさらに一般的で面倒です。

id、day、if(day = '月曜日'、1、if(day = '火曜日'、2、if(day = '水曜日'、3、if(day = 'thursday'、4、if(day = ') frday '、5、if(day =' saturday '、6,7)))))))テスト順序からday_nrとしてday_nr。

ストアドプロシージャで名前からintへの変換の詳細を非表示にすることもできます。


0


もう1つの方法は、それらの日とそれらを並べ替えるintを使用して別のテーブルを作成し、検索時にそのテーブルを結合し、それを並べ替えることです。 もちろん、varcharに参加することはお勧めできません。

テーブルDaysOfWeek id |日-------------------- 1 |月曜日2 |火曜日3水曜日4 |木曜日5金曜日6土曜日

SELECT * FROM WhateverTableから左に結合DaysOFWeek on DaysOFWeek.day = WhateverTable.dayColumn ORDER BY DaysOfWeek.id

(それが正しくない場合は謝罪。最近SQL Serverに行き詰まった)

繰り返しますが、これはお勧めできませんが、すでに持っているデータを変更できない場合は…​ dayColumnフィールドに標準外の値がある場合もこれは機能します。


0


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


0


私はこれが古いスレッドであることを認識しています、しかしそれが特定の検索時間の間グーグルのトップに来るので、私は私のアプローチを共有するためにそれを使用します。

元の質問と同じ結果が欲しいのですが、それに加えて、現在の曜日から始めて、それから残りの日まで進行する結果の順序付けが欲しいのです。

私は別のテーブルを作成しました。そこでは、あなたが何日から始めても7日のシーケンスを実行することができるように、2日にわたってリストされた日があります。

存在しない場合はCREATE TABLEを作成する `Weekdays '(` id` int(11)NOT NULL AUTO_INCREMENT、 `name` varchar(50)NOT NULL DEFAULT'、主キー(` id`) 15;

「平日」(「id」、「名前」)の値に挿入(1、「月曜日」)、(2、「火曜日」)、(3、「水曜日」)、(4、「木曜日」)、(5、 「金曜日」、(6、「土曜日」)、(7、「日曜日」)、(8、「月曜日」)、(9、「火曜日」)、(10、「水曜日」)、(11、「木曜日」 ')、(12、'金曜日 ')、(13、'土曜日 ')、(14、'日曜日 ');

次に、開始点を順番に決定する変数を使用してクエリを実行し、結合を使用して日の注文番号を取得しました。 たとえば、水曜日にリスティングを開始するには、次のようにします。

SELECT @startnum:=平日のどこから= MIN(id)WHERE name = 'Wednesday'; SELECT * FROMイベントの内部結合(SELECT idからweekdaynum、名前のdaynameからFROM Weekdays WHERE id>(@ startnum-1)AND id <(@ startnum 7))AS s2 ON s2.dayname = Events.day ORDER BY weekdaynum;

私はこれがこの記事につまずく人を助けるのを願っています。


0


私のために働く別の方法を見つけました:

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

それが役に立てば幸い


-1


これを試してみると、うまくいくはずです。

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