2012-01-30 58 views
1

是否可以在select語句中使用多個訂單條款?我可以做這樣的事嗎?T-SQL多個訂單條款

SELECT TOP(5) * FROM [Db].[dbo].[Schedules] 
where (datepart(hour, [Arrival]) >= datepart(hour, getdate())) 
order by abs((datepart(hour, [Arrival]) - datepart(hour, getdate()))*60 + datepart(minute, [Arrival]) - datepart(minute, getdate())) 
order by [Arrival] 

我需要第二順序的原因是爲了確保記錄以遞增的到達時間返回。

TIA。

回答

3

用逗號分隔的列表:

SELECT 
    TOP(5) * 
FROM 
    [Db].[dbo].[Schedules] 
where 
    (datepart(hour, [Arrival]) >= datepart(hour, getdate())) 
order by 
    abs( 
    (datepart(hour, [Arrival]) - datepart(hour, getdate()))*60 + datepart(minute, [Arrival]) - datepart(minute, getdate()) 
    ), 
    [Arrival] 
+0

謝謝你們。那很快。 – 2012-01-30 22:56:32

+0

給出了一個快速嘗試,但結果不會按照到達順序返回。還有別的嗎? – 2012-01-30 22:59:20

+0

它們將首先按您的abs()函數結果排序,然後(按照到達順序排列的所有記錄,其值相同)。確保您的abs()結果具有可以在其中排序的重複項。 – 2012-01-30 23:02:25

4

不要重複ORDER BY兩次。用逗號分隔您的項目。

SELECT TOP(5) * 
    FROM [Db].[dbo].[Schedules] 
    where (datepart(hour, [Arrival]) >= datepart(hour, getdate())) 
    order by abs((datepart(hour, [Arrival]) - datepart(hour, getdate()))*60 + datepart(minute, [Arrival]) - datepart(minute, getdate())), 
      [Arrival] 
1

本質上是堆棧排序。

因此,如果您有像order by duration, arrival這樣的子句,SQL將首先嚐試按持續時間進行排序,然後按每個持續時間的值到達。