2011-02-05 65 views
1

我的表架構(表名稱股票)如何排序在SQL Server的Varchar日期2000

Date Datetime 

如果Date其數據類型是Datetime那麼SQL服務器排序日期以及/完美訂購。見下面的例子。

select date from stock order by date 

然後結果是:

Date(yyyy/MM/dd) 
2010-04-02 00:00:00.000 
2011-02-02 00:00:00.000 
2011-02-03 00:00:00.000 
2011-02-03 00:00:00.000 

但如果我要鑄造VARCHAR排序相同比將最終創造出的問題,問題是它不會按日期順序排序日期它現在在Varchar中投射。

請看下面的例子:

select date = convert(varchar, date, 103) from stock order by date 

然後結果是:

Date(dd/MM/yyyy) 
02/02/2011 
02/04/2010 
03/02/2011 
03/02/2011 

你可以看到第二個查詢的結果,它不會爲了排序日期,因爲現在不是datetime數據類型。這是鑄造爲varchar或者你可以說它是字符串。

現在來到的一點:

如果我要排序這是在VARCHAR按日期比怎麼辦呢鑄造日期?

+0

@marc_s,謝謝,但請閱讀我的問題的最後一行。 – mahesh 2011-02-05 08:48:42

+0

@marc_s,你是指存儲日期爲數據類型日期,哦!來人SQL-Server-2000沒有數據類型日期。 – mahesh 2011-02-05 09:05:05

+0

不,但SQL Server 2000 **具有** DATETIME數據類型 - 使用它! – 2011-02-05 09:05:39

回答

6

你在做什麼是轉換varcharvarchar,然後通過排序......你不按日期排序!

convert(varchar, date, 103) 
     ********* 

這種類型這裏是你轉換你的價值成 - 你轉換varchar - 當然它不會按日期排序呢!

試試這個:

SELECT CONVERT(DATETIME, date, 103) 
FROM dbo.Stock 
ORDER BY CONVERT(DATETIME, date, 103) 

NOW你你varchardate實際上轉換爲DATETIME值和排序上造成DATETIME - 現在你得到的輸出:

2010-04-02 00:00:00.000 
2011-02-02 00:00:00.000 
2011-02-03 00:00:00.000 
2011-02-03 00:00:00.000 

更新:如果你需要另一種格式,你當然可以轉換你的DATETIME再次回到使用CONVERT具有不同風格VARCHAR

閱讀所有關於MSDN CAST and CONVERT

SELECT 
    date = CONVERT(VARCHAR, CONVERT(DATETIME, date, 103), 103) -- convert back to VARCHAR 
FROM 
    dbo.Stock 
ORDER BY 
    CONVERT(DATETIME, date, 103) -- sort by the DATETIME ! 

支持什麼樣式,然後你會得到這樣的輸出:

02/04/2010 
02/02/2011 
03/02/2011 
03/02/2011 

只是要一定要對DATETIME值進行排序! (而不是你的DATETIME的字符串表示)

正如我所說:如果您從一開始就將日期存儲爲DATETIME,那麼您將爲自己節省很多來回的轉換!

1

您可以使用子查詢,如下所示

select convert(varchar,date,103) date from (select date from stock order by date)p