我有一个名为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
答案 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
或转换,如果由于某种原因不会施放。
与其他人一样,虽然我将数据和时间构建到一个值,然后转换/转换为订购。
我还认真考虑在提供数据时做一些事情,以获得日期时间,以便我可以将其编入索引,除非这是一个非常罕见的要求。这将是非常低效的。