有date1和date2, 
要求date1為null值的排在前面,再將date2和當前時間比效,小時數大的排在前面,這是date1為null的排序, 然後再將剩下的date1不為null值的以desc排序。 
1.
order by  isnull(date1,'1900-01-01') asc,date1 desc,DateDiff('h', getdate(), date2) ASC2.
order by case when date1 is null then 0 else 1 end,date1 desc,DateDiff(hh, getdate(), date2) 
--------------
以前在這裡問過,現在發現有點問題,上面兩條sql是以前回復的,第1條不能將date1不為null值的以desc排序,基本同等於order by date1 asc,DateDiff('h', getdate(), date2) ASC
第2條是正確的,可以實現,不過用起來後發現速度真的很慢,所以不想用第二條,想用第一條,怎麼修改?或者有沒有更好的?

解决方案 »

  1.   


    order by  isnull(date1,'9999-01-01')  desc,DateDiff('h', getdate(), date2) ASC 
      

  2.   

    一個時間字段,將null值排在前面,然後將不是null值以desc排序怎麼寫?
      

  3.   

    這個不行,null值全都排在最後面了,我發現isnull(date1,'9999-01-01') desc相當於date1 desc
      

  4.   

    這個不行,null值全都排在最後面了,我發現isnull(date1,'9999-01-01') desc相當於date1 desc 不会的啊,如果为null,他的时间就是'9999-01-01'排在最前面啦
      

  5.   

    為什麼我的不是這樣?我的是英文版ms sql server2000
      

  6.   

    select * from (select top 100 percent * from tb where date1 is null order by datepart(hh,date2) desc)
    union all
    select * from (select top 100 percent * from tb where date1 is not null order by date1 desc)
      

  7.   

    不行出錯:
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E21)
    ODBC driver does not support the requested properties.
      

  8.   

    我搞錯了,這是對的,沒看到改時間,原來null的語法是這樣的:時間值為null就返回'9999-01-01',不為null返回date1
    不過我的時間類型為smalldatetime,所以改為isnull(date1,'2079-06-06') desc 這樣就行了。謝謝