2012-03-23 82 views
-1

我有一個名爲PublishTime的nvarchar(max)字段,其中包含HH:MMtt(10:20 AM)中的時間,現在我想基於此排序結果字段,但因爲它是nvarchar類型,我不能將它用於子句順序,任何人都可以幫助我如何根據此字段對結果進行排序。基於nvarchar(max)類型的時間排序記錄

我想下面的查詢其拋出轉換錯誤

select c.PublishDate, c.PublishTime from CrossArticle_Article c 
inner join CrossArticle_ArticleToCategory a2c 
on c.Id = a2c.ArticleId 
inner join CrossArticle_Category cc 
on a2c.CategoryId = cc.Id 
where cc.Id = 86 order by c.PublishDate, convert(nvarchar(max), cast(c.PublishTime as time)) desc 
+1

你可以改變該字段的數據類型嗎? – AdaTheDev 2012-03-23 20:38:50

+0

您是否嘗試將NVARCHAR(MAX)轉換爲DATETIME,然後使用ORDER BY子句? – 2012-03-23 20:40:41

+0

實際上該字段的數據來自前端asp.net,網頁(下拉列表),所以如果我把它做成日期時間,我不會能夠在這些字段中存儲時間,而且我也有記錄已經有時間,如果我現在改變類型,這些值會保留下來嗎? – Abbas 2012-03-23 20:41:42

回答

2

2008年SQL,有一個時間的數據類型,這是理想在這裏 - 我真的建議轉換數據類型該字段 - 使用最小的,最合適的數據類型來保存數據。

假設所有的值都是有效的時候,這裏有一個完整的例子來演示:

CREATE TABLE #Example 
(
PublishTime NVARCHAR(MAX) 
) 

-- Insert some sample data 
INSERT #Example (PublishTime) VALUES ('10:20AM'), ('10:20PM'), (NULL), ('') 

-- Demonstrate the NVARCHAR -> TIME conversion 
SELECT PublishTime, CAST(PublishTime AS TIME) AS ConvertedToTimeDataType 
FROM #Example 

-- This will change the datatype on the table 
ALTER TABLE #Example 
ALTER COLUMN PublishTime TIME 

-- Now check what is now in the table 
SELECT * FROM #Example 

DROP TABLE #Example 

所以,如果你可以切換的數據類型,然後你可以這樣做:

SELECT Something 
FROM YourTable 
ORDER BY PublishTime 

沒有轉換/對所需字段進行特殊處理,這意味着如果PublishTime上有合適的索引,則可以使用它。

+0

在轉換之前,您可能需要檢查您的數據以確保它是全部時間數據。使用不適當的數據類型的問題之一是輸入錯誤的數據。對於時間數據類型,不能輸入非時間。因此當您從一開始就使用正確的數據類型時,您無需修復25:99或ASAP的時間。 – HLGEM 2012-03-23 21:10:28

+0

我照你所說的做了,我在select查詢中添加了列,並且這次它被轉換爲時間類型,保存字符串格式的時間,然後對該字段進行排序,但數據庫引擎似乎沒有將字符串轉換爲字符串時間,任何幫助 – Abbas 2012-03-23 21:16:33

0

你需要做一個時間字段。您將日期和時間作爲字符串放在單獨的字段中,這是要避免的反模式。

您可以利用CROSS APPLY指您在order by使級聯日期時間字段:

CROSS APPLY (SELECT CAST((PUBLISHDATE + ' ' +PUBLISHTIME) as datetime)) CxA(FullDate) 

ORDER BY FullDate 
1

試試這個:

select c.PublishDate, c.PublishTime from CrossArticle_Article c 
inner join CrossArticle_ArticleToCategory a2c 
on c.Id = a2c.ArticleId 
inner join CrossArticle_Category cc 
on a2c.CategoryId = cc.Id 
where cc.Id = 86 order by cast(c.PublishTime as TIME) desc 
0

呃這是什麼?

order by c.PublishDate, convert(nvarchar(max), cast(c.PublishTime as time)) desc 

這是將一個字符串作爲一個時間,然後轉換爲一個字符串。

應該

order by c.PublishDate, cast(c.PublishTime as time)) desc 

或轉換,如果它不會投的某些原因。

像其他人一樣,雖然我會建立數據和時間到一個值,然後轉換/轉換爲訂購。

我也會認真考慮在做數據時要做些什麼,以便獲得一個日期時間以便我能夠索引它,除非這是一個非常罕見的要求。這將是非常低效的。