Tsql 检索字符串部分的子字符串

Tsql 检索字符串部分的子字符串,tsql,substring,Tsql,Substring,我的数据库中有一个数据类型为varchar10的字段。我在这里节省时间:上午/下午1分钟。我让用户从下拉列表中选择小时、分钟、上午/下午,我将其连接并保存到表中,如下所示: 01:00 PM 我想做的是,分离这个字符串,这样我就可以提取出小时、分钟和PM或am。首先想到的是子字符串,下面是我一直在尝试的: select substring('01:00 PM',1,2) as [Hour] Select substring('01:00 PM',4,5) as [Minute] selec

我的数据库中有一个数据类型为varchar10的字段。我在这里节省时间:上午/下午1分钟。我让用户从下拉列表中选择小时、分钟、上午/下午,我将其连接并保存到表中,如下所示:

01:00 PM
我想做的是,分离这个字符串,这样我就可以提取出小时、分钟和PM或am。首先想到的是子字符串,下面是我一直在尝试的:

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。对于分钟,我没有得到正确的值,它显示我00 PM,然后对于AMPM,我再次得到正确的PM值。为什么我在一分钟内得到了错误的值?或者是否有其他方法可以得到相同的结果,如01,00,PM

SUBSTRING的第三个参数是要选择的字符数,所以对于分钟,它应该是

Select substring('01:00 PM',4,2) as [Minute]. 
此外,您的AMPM应更改为

select substring('01:00 PM',7,2) as [AMPM]
。AMPM的结果是正确的,因为它恰好是字符串的结尾,但您当前的语句将从位置7开始提取8个字符。

您可以在下面进行尝试-

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]

为什么不把它转换成时间呢

select convert(time, '01:00 PM') 
可以使用datepart或datename提取小时和分钟。使用24小时制,因此不需要AM/PM

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

您还可以将其添加到表中:

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

使用正确的类型,而不是字符串,时间应该更容易处理。

您也可以像下面这样处理分钟

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)

切勿在varchar列中存储日期/时间值,请使用正确的数据类型!DATE在搜索/排序/加入/分组/中间比VARCHAR高效得多,所以VARCHAR甚至不是一个选项请参见答案。@jarlh我需要能够让用户选择特定的分钟,所以我有分钟、小时和AM/PM的下拉列表-我想你建议的使用Datetime字段的任何方法?jarlh的观点是,您可以使用SQL Server将数据存储为datetime,但可以使用DATEPART将分钟/小时/等值提供给用户供选择。@Koosh您可以在应用程序代码中进行转换,而不是数据库本身。从输入构造适当的对象,然后执行查询以执行insert语句。如果需要将其渲染回用户,请在选择时执行相反的操作。