子字符串可检索字符串的一部分

时间:2019-04-17 12:59:53

标签: tsql substring

我的数据库中有一个字段,其数据类型为varchar(10)。我在这里保存小时:分钟AM / PM。我让用户从下拉菜单中选择小时,分钟,上午/下午,然后将其连接起来并保存到表中,如下所示:

01:00 PM

我想做的是将字符串分开,这样我就可以提取小时,分钟和PM或AM。首先想到的是Substring,这就是我一直在尝试的事情:

select substring('01:00 PM',1,2) as [Hour] 
Select substring('01:00 PM',4,5) as [Minute] 
select substring('01:00 PM',7,8) as [AMPM] 

对于小时,我得到的正确值为01。对于Minute,我没有得到正确的值,它向我显示00 PM,然后对于AMPM,我再次得到了正确的值PM。任何原因导致我在Minute中得到错误的值?还是有一种替代方法,我可以获得与01, 00, PM

中相同的结果

4 个答案:

答案 0 :(得分:3)

为什么不将其转换为时间?

select convert(time, '01:00 PM') 

您可以使用datepart()datename()提取小时和分钟。使用24小时制,因此不需要AM / PM。

用户可以选择时间作为时间值。

您也可以将其添加到表中

alter table t add col_time as (try_convert(time, col));

time应该更容易使用正确的类型而不是字符串。

答案 1 :(得分:2)

SUBSTRING的第三个参数是要选择的字符数,因此对于Minute,应为

Select substring('01:00 PM',4,2) as [Minute]. 

此外,您的AMPM应该更改为

select substring('01:00 PM',7,2) as [AMPM]

。您获得了正确的AMPM结果,因为它恰好是字符串的结尾,但是您当前的语句将从位置7开始提取8个字符。

答案 2 :(得分:1)

您可以在下面尝试-

select substring('01:00 PM',1,2) as [Hour] 
Select substring('01:00 PM',4,2) as [Minute] 
select substring('01:00 PM',7,2) as [AMPM]

答案 3 :(得分:1)

您也可以在几分钟内完成以下操作

DECLARE @textval NVARCHAR(30),@STR nvarchar(200)
SET @textval = '01:00 PM'
SET @STR = STUFF(@textval,1,3,'')
SELECT LEFT(SUBSTRING(@STR, PATINDEX('%[0-9.-]%', @STR), 8000),
       PATINDEX('%[^0-9.-]%', SUBSTRING(@STR, PATINDEX('%[0-9.-]%', @STR), 8000) + 'X') -1)