将 AM/PM 时间从字符串转换为时间

Convert an AM/PM Time from String to Time

我有一个 table,其时间列是一个字符串 [nvarchar(50)],具有以下值。

5:34 AM
4:06 PM
7:14 PM
10:25 PM
2:12 AM

在我的查询中,我试图按升序对各行进行排序,但是因为它是一个字符串,所以它是按字母顺序排序的。

我可以在 ORDER 语句中使用将字符串转换为时间或日期时间变量的函数吗? 我试过使用 CAST 和 CONVERT,但没有成功。

CAST([Time] AS datetime)

Convert(nvarchar(50),[Time],101)

谢谢!

您可以使用 TRY_CONVERT() 按正确的类型排序(并避免进入 table 的垃圾错误):

DECLARE @BadDesign table(PoorChoice nvarchar(50));

INSERT @BadDesign(PoorChoice) VALUES
(N'5:34 AM'),
(N'4:06 PM'),
(N'7:14 PM'),
(N'10:25 PM'),
(N'2:12 AM'),
(N':00 PM');

SELECT PoorChoice, TRY_CONVERT(time, PoorChoice)
  FROM @BadDesign 
  ORDER BY TRY_CONVERT(time, PoorChoice);

输出:

PoorChoice (No column name)
:00 PM null
2:12 AM 02:12:00
5:34 AM 05:34:00
4:06 PM 16:06:00
7:14 PM 19:14:00
10:25 PM 22:25:00

请注意,垃圾数据排在最前面。如果要过滤掉:

WHERE TRY_CONVERT(time, PoorChoice) IS NULL

用固定日期和 space 作为时间前缀,即“01-01-1980”。然后你就可以转换为日期时间了。

只需尝试将字符串转换为 TIME.
如果是坏数据 TRY_CAST returns NULL.

declare @test table (timestring nvarchar(8));
insert into @test values 
('5:34 AM'), 
('4:06 PM'), 
('7:14 PM'), 
('10:25 PM'), 
('2:12 AM');

select *
, try_cast(timestring as time(0)) 
from @test;
timestring (No column name)
5:34 AM 05:34:00
4:06 PM 16:06:00
7:14 PM 19:14:00
10:25 PM 22:25:00
2:12 AM 02:12:00

测试 db<>fiddle here