2016-05-31 10 views
-1

すべて私にはの注文が必要な次の表があります。開始時刻はです。ORDER BYをSQL Serverの文字列で使用する

例のデータ:このクエリを実行するとき

5:00am-3:00pm 
5:00am-4:00pm 
7:30am-3:30pm 
7:31am-1:01pm 
10:00am-3:30pm 
10:30am-4:00pm 
2:00pm-10:00pm 
2:00pm-10:45pm 
3:30pm-10:00pm 
4:30pm-10:00pm 

は現在、私は次のように取得しています:

4:30pm-10:00pm 
5:00am-4:00pm 
10:30am-4:00pm 
2:00pm-10:45pm 
5:00am-3:00pm|3:30pm-10:00pm 
NA 
7:30am-3:30pm 
10:00am-3:30pm 
7:31am-1:01pm 
2:00pm-10:00pm 

だから、上記の例の文字列の時代に、私はそうのようにそれらを注文することが必要になります。

SELECT [id] 
     ,[mon] 
FROM [DBc83].[dbo].[tmpTable] 
ORDER BY mon DESC 

、出力は次のとおりです。

id mon 
9 7:31am-1:01pm 
7 7:30am-3:30pm 
2 5:00am-4:00pm 
5 5:00am-3:00pm 
1 4:30pm-10:00pm 
6 3:30pm-10:00pm 
4 2:00pm-10:45pm 
10 2:00pm-10:00pm 
3 10:30am-4:00pm 
8 10:00am-3:30pm 
+2

これらは**文字列**なので、 'ORDER BY'は文字列になり、そのユースケースに対して**正しい結果**を返します。 ** time **で注文する必要がある場合は、 'TIME'の値を提供する必要があります:....(例えば、その文字列から*開始時刻*を抽出してそれを注文する必要があります) –

+8

ルートの問題は、間違ったデータ型を使用したことです。将来、 'time'または' datetime'カラムのペアを使うことを検討してください。その間に、あなたが持っているものをその場で役立つものに変換する必要があります。 –

答えて

1

以下のようなものを試してみてください、

SELECT [id], 
     [mon] 
FROM [DBc83].[dbo].[tmpTable] 
ORDER BY 
     CAST(LEFT(mon, CHARINDEX('-', mon) -1) AS TIME), 
     CAST(RIGHT(mon,LEN(mon)-(CHARINDEX('-',mon))) AS TIME) 

キャストは、ANSIおよびANSI-SQLは、データベースプラットフォーム間での移植性 だから、私が使用しているされていますここにキャストして、それがあなたの期待された成果として働くことを期待してください!

LiveDemo

Updated Answer

SELECT [id], 
     [mon] 
FROM [DBc83].[dbo].[tmpTable] 
ORDER BY 
     CAST(LEFT(NULLIF(mon,'NA'), CHARINDEX('-', NULLIF(mon,'NA')) -1) AS TIME), 
     CAST(RIGHT(NULLIF(mon,'NA'),LEN(NULLIF(mon,'NA'))-(CHARINDEX('-',NULLIF(mon,'NA')))) AS TIME) 

New Updated Answer

これが解決策になる可能性があります。

+0

素晴らしい作品、ありがとうpedram! – StealthRT

+0

実際には、時刻関連のデータがない場合は、NAのように時刻データの一部がフォーマットされていると言っています。どのように私はそれを補償するだろうか? – StealthRT

+0

NAIFのようにフォーマットされたデータの場合、NULLIFを使用できます。私の更新された答えを見てください。 – pedram

1

これを試してみてください:

SELECT 
    [id],[mon] 
FROM 
    [DBc83].[dbo].[tmpTable] 
ORDER BY 
    convert(time, substring(mon,0,charindex('-',mon))), 
    convert(time, substring(mon,charindex('-',mon)+1,len(mon))) 
+0

実際には、時刻関連のデータがない場合は、NAのような形式のデータがあると言っています。どのように私はそれを補償するだろうか? – StealthRT

関連する問題