【问题标题】:Substring to retrieve parts of a string用于检索部分字符串的子字符串
【发布时间】:2019-04-17 21:48:54
【问题描述】:

我的数据库中有一个数据类型为 varchar(10) 的字段。在这里,我正在节省 Hour:Minute AM/PM。我让用户从下拉列表中选择小时、分钟、上午/下午,我将其连接起来并将其保存到这样的表中:

01:00 PM

我想要做的是分离这个字符串,以便我能够提取小时、分钟和下午或上午。首先想到的是子字符串,所以这就是我一直在尝试的:

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] 

对于 Hour,我得到了正确的值,即 01。对于 Minute,我没有得到正确的值,它显示了 00 PM,然后对于 AMPM,我再次得到了正确的值 PM。为什么我在 Minute 中得到错误的值?或者是否有其他方法可以获得相同的结果,如01, 00, PM

【问题讨论】:

  • 永远不要在 varchar 列中存储日期/时间值,使用正确的数据类型!
  • "DATE 在搜索/排序/加入/组/之间比VARCHAR 更有效,所以VARCHAR() 甚至不是一个选项”参见this 答案。
  • @jarlh 我需要能够让用户选择一个特定的分钟,所以我有分钟、小时和上午/下午的下拉菜单-使用日期时间字段的任何方式(我想你是建议?)
  • 就 jarlh 而言,您可以将数据存储为日期时间(假设 SQL Server),但使用 DATEPART() 来显示分钟/小时/等。值供您的用户选择。
  • @Koosh 您将在应用程序代码中进行转换,而不是在数据库本身中。从输入构造一个适当的对象,然后执行查询以执行insert 语句。如果您需要将其呈现给用户,则在 select 上执行相反的操作。

标签: tsql substring


【解决方案1】:

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

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

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

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

您也可以将其添加到表格中:

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

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

【讨论】:

    【解决方案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 个字符。

    【讨论】:

      【解决方案3】:

      你可以试试下面-

      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]
      

      【讨论】:

        【解决方案4】:

        你也可以像下面那样做一分钟

        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)
        

        【讨论】:

          猜你喜欢
          • 2017-01-04
          • 2011-09-17
          • 2012-08-16
          • 2012-02-13
          • 1970-01-01
          • 2015-02-05
          • 1970-01-01
          • 1970-01-01
          • 2018-05-22
          相关资源
          最近更新 更多