我正在尝试按数据类型为nvarchar
的列进行排序。我的列数据如下所示:
9 AM - 11 AM
1 PM - 3 PM
11 AM - 1 PM
3 PM - 5 PM
5 PM - 7 PM
我想以这种方式通过我的专栏订购:
9 AM - 11 AM
11 AM - 1 PM
1 PM - 3 PM
3 PM - 5 PM
5 PM - 7 PM
我该怎么做?
答案 0 :(得分:0)
您可以创建一个变量,其中包含您希望按数据中未出现的字符分隔的排序顺序中的项目。当我使用波浪号("〜")字符之前完成此操作时。它看起来像这样......
DECLARE @CustomSortOrder VARCHAR(100)
SET @CustomSortOrder = '9 AM - 11 AM~11 AM - 1 PM~1 PM - 3 PM~3 PM - 5 PM~5 PM - 7 PM~'
SELECT *
FROM [YourTable]
ORDER BY CHARINDEX([YourTable].[YourColumn] + '~', @CustomSortOrder)
对于这种情况,您可能没有波形符分隔符。但是,无论如何,我都喜欢它以提高可读性。
答案 1 :(得分:0)
请注意,这不会有效并且非常容易出错 - 您应该认真考虑将这些值存储为实时。 我使用一个表变量和一个名为[timen]的列来存储您的值。 获取倒数第二个字符的ASCII值,并将其添加到字符串中空格的剩余值:
DECLARE @timetable TABLE(timen nvarchar(5));
INSERT INTO @timetable(timen)
VALUES ('9 AM'), ('11 AM'), ('1 PM'), ('3 PM'), ('11 AM'), ('1 PM'), ('3 PM'), ('5 PM'), ('5 PM'), ('7 PM');
SELECT t.timen
FROM @timetable t
ORDER BY LEFT(t.timen, (PATINDEX('% %', t.timen) - 1)) + ASCII(SUBSTRING(RIGHT(t.timen, 2), 1, 1));
答案 2 :(得分:0)
试试这个,
declare @t1 table(col1 varchar(50))
insert into @t1 values
('9 AM - 11 AM')
,('1 PM - 3 PM')
,('11 AM - 1 PM')
,('3 PM - 5 PM')
,('5 PM - 7 PM')
SELECT row_number() OVER (
ORDER BY cast(substring(col1, 0, charindex('-', col1)) AS TIME)
) rn
,col1
FROM @t1