将 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
我有一个 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