Сортировка записей по времени, тип nvarchar (max) - PullRequest
0 голосов
/ 24 марта 2012

У меня есть поле nvarchar (max) с именем PublishTime, которое содержит время в формате ЧЧ: MMtt (10:20 AM), теперь я хочу отсортировать результаты на основе этого поля, но так как это тип nvarchar, я не могу используйте его для сортировки по пунктам, кто-нибудь может мне помочь, как отсортировать результаты по этому полю.

Я пробовал ниже запрос, который выдает ошибку преобразования

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 ]

2 голосов
/ 24 марта 2012

В 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 голос
/ 24 марта 2012

попробуйте это:

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 голосов
/ 24 марта 2012

Эрм Что это?

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

Это приведение строки как времени, а затем преобразование в строку.

должно быть

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

или конвертируйте, если по какой-то причине он не будет разыгран.

Как и другие, хотя я собираю данные и время в одно значение, а затем преобразую / приведу их к упорядочению.

Я бы также серьезно подумал о том, чтобы что-то делать при вводе данных, чтобы получить дату и время, чтобы я мог их проиндексировать, если только это не было очень редким требованием. Это будет ужасно неэффективно.

0 голосов
/ 24 марта 2012

Вам необходимо заполнить поле даты и времени. У вас есть дата и время в отдельных полях в виде строк, что является антипаттерном, которого следует избегать.

Вы можете использовать CROSS APPLY для ссылки на объединенное поле даты и времени, которое вы вводите в order by:

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

ORDER BY FullDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...