基于nvarchar(max)类型的时间对记录进行排序

时间:2012-03-23 20:36:46

标签: sql-server-2008 time

我有一个名为PublishTime的nvarchar(max)字段,其中包含HH中的时间:MMtt(上午10:20),现在我想根据此字段对结果进行排序,但由于它是nvarchar类型,我不能将它用于order by子句,任何人都可以帮助我如何根据这个字段对结果进行排序。

我尝试了下面的查询,这是投掷转换错误

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

4 个答案:

答案 0 :(得分:2)

在SQL 2008中,有一种理想的TIME数据类型 - 我真的建议切换该字段的数据类型 - 使用最小的,最合适的数据类型来保存数据。

假设所有值都是有效时间,这里有一个完整的示例来演示:

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上有适当的索引,则可以使用它。

答案 1 :(得分: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

答案 2 :(得分:0)

您需要创建一个日期时间字段。您将日期和时间作为字符串放在单独的字段中,这是一个要避免使用的反模式。

您可以使用CROSS APPLY来引用您在order by中添加的连接日期时间字段:

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

ORDER BY FullDate

答案 3 :(得分:0)

呃这是什么?

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

那是一个字符串作为时间然后转换为字符串。

应该是

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

或转换,如果由于某种原因不会施放。

与其他人一样,虽然我将数据和时间构建到一个值,然后转换/转换为订购。

我还认真考虑在提供数据时做一些事情,以获得日期时间,以便我可以将其编入索引,除非这是一个非常罕见的要求。这将是非常低效的。