mssql 日期排序

一個table內的日期欄位
希望優先列出尚未過期的資料, 然後再列出已經過期的
過期的依據是以現在時間為準

SELECT id, dt, dbo.JinDateDiff(dt) AS df, title FROM [ORDER] ORDER BY df DESC

寫了一個自定函數去算出資料的datediff
主要是去判斷過期與否然後改變datediff的回傳數值
達到排序的依據

USE [jin]
GO
/****** 物件: UserDefinedFunction [dbo].[JinDateDiff] 指令碼日期: 02/17/2011 23:28:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
– =============================================
– Author:
– Create date:
– Description:
– =============================================
ALTER FUNCTION [dbo].[JinDateDiff]
(
– Add the parameters for the function here
@Date datetime
)
RETURNS int
AS
BEGIN
declare @ret int
IF @Date <= { fn NOW() }
SET @ret = Datediff(d,@Date,{ fn NOW() }) * -10
else
SET @ret = Datediff(d,@Date,{ fn NOW() })
 
RETURN @ret
END

結果:
先列出還沒過期的資料
——————————————————
4 2011/2/17 上午 12:00:00 0 0217
5 2011/2/18 上午 12:00:00 -1 0218
6 2011/2/19 上午 12:00:00 -2 0219
這邊開始是過期的
——————————————————
3 2011/2/16 上午 12:00:00 -10 0216
2 2011/2/15 上午 12:00:00 -20 0215
1 2011/2/14 上午 12:00:00 -30 0214

更有效率的作法
*需要MSSQL 2005以上

SELECT *, ROW_NUMBER() OVER(ORDER BY dt) FROM [ORDER] WHERE dt > getdate()
UNION ALL
SELECT *, ROW_NUMBER() OVER(ORDER BY dt DESC) FROM [ORDER] WHERE dt < getdate()