我的数据库中有一个字段,其数据类型为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
答案 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)