2012-02-21 146 views
-2

我有像下面的表格數據。SQL查詢訂購

d1 date      sale_time 
    N 2012-03-09 00:00:00.000  TBD 
    No 2011-09-26 00:00:00.000  2:00 PM CT 
    N 2012-01-26 00:00:00.000  1:00 PM CT 
    N 2012-03-07 00:00:00.000  1:00 PM ET 
    yes 2012-02-23 00:00:00.000  Accepting Offers 

我想按日期遞增,銷售時間ASC(如果銷售時間不包含時間應該放在最後記錄) 結果爲了我想出來讓像

d1  date       sale_time 
    No 2011-09-26 00:00:00.000  2:00 PM CT 
    N 2012-01-26 00:00:00.000  1:00 PM CT  
    N 2012-03-07 00:00:00.000  1:00 PM ET 
    YEs 2012-02-23 00:00:00.000  Accepting Offers 
    N 2012-03-09 00:00:00.000  TBD 

我有試過在查詢下方,但在轉換銷售時間時出現錯誤。

select 
    * 
from 
    table 
order by 
    date asc, 
    convert(datetime, SUBSTRING(replace(sale_time,' ',''), 
    1, 
    (CHARINDEX(':',replace(sale_time,' ',''))+4))) asc 
+1

「如果銷售時間不包含時間...錯誤,同時將銷售時間轉換爲日期」 – Paparazzi 2012-02-21 20:18:13

+0

我有這樣的數據在我的表中,我需要這樣的輸出 – Sree 2012-02-21 20:21:29

+0

有人刪除我的評論?好;那些去哪裏,我們有理由爲什麼? – 2012-02-21 21:34:45

回答

0

也許這將幫助:

首先是一些測試數據:

DECLARE @tbl TABLE(d1 VARCHAR(100),[date] DATETIME,sale_time VARCHAR(100)) 

INSERT INTO @tbl 
VALUES 
    ('N','2012-03-09 00:00:00.000','TBD'), 
    ('No','2011-09-26 00:00:00.000','2:00 PM CT'), 
    ('N','2012-01-26 00:00:00.000','1:00 PM CT'), 
    ('N','2012-03-07 00:00:00.000','1:00 PM ET'), 
    ('yes','2012-02-23 00:00:00.000','Accepting Offers') 

然後查詢:

;WITH CTE AS 
(
    SELECT 
     (
      CASE 
       WHEN NOT CHARINDEX(':',sale_time)=0 
       THEN SUBSTRING(sale_time,0,5) 
       ELSE NULL 
      END 
     ) AS sale_time_format, 
     tbl.d1, 
     tbl.date, 
     tbl.sale_time 
    FROM 
     @tbl AS tbl 
) 
SELECT 
    CTE.d1, 
    CTE.date, 
    CTE.sale_time 
FROM 
    CTE 
ORDER BY 
    CTE.sale_time_format DESC, 
    CTE.date 

你並不需要accualy按日期和訂購好。只需要sale_time_format即可獲得您想要的結果。我已經包含它,因爲你可能有更多的數據。