一個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()