【问题标题】:I Want to extract time from a string我想从字符串中提取时间
【发布时间】:2021-04-07 09:46:30
【问题描述】:

字符串示例:

DH      SG 136      BOM      (20:15)       (22:20)      DEL  FLT     SG 11       DEL      (08:55)       (12:50)      DXB  FLT     SG 14       DXB      (14:00)       (16:55)      BOM  

我的查询是:

 select
 right (substring(previousdata,0,charindex(':',previousdata)+1),3)+
 left(substring(previousdata,charindex(':',previousdata)+1, len(previousdata)),2) as TimeSt,
  PreviousData from com.NOTIFICATIONHISTORY

问题是它也在来回提取非数值分号: 我只想要时间..字符串中提到的第一个“时间”

【问题讨论】:

  • DH:SG 282 MAA-AMD 12:13 2013 年 11 月 28 日 14:38 2013 年 11 月 28 日,FLT:SG 345 AMD-PNQ 21:34 22:55,FLT:SG 345 PNQ-BLR 23:39 01:05。此字符串返回错误值
  • 您应该提供样本数据和期望的结果。你的解释不清楚。
  • 我只需要分号前2位和分号后2位
  • 我需要 12:15 的结果。请注意,字符串非常可疑。字符串的开头还有其他分号,前后都有字母

标签: sql sql-server substring


【解决方案1】:

看起来字符串中的时间戳有前导零(所以是 01:15,而不是 1:15),类似以下内容应该可以工作:

select SUBSTRING(X, PATINDEX('%[0-9][0-9]:[0-9][0-9]%', X), 5)

测试:

select
SUBSTRING(X, PATINDEX('%[0-9][0-9]:[0-9][0-9]%', X), 5)
, X
from
(select 
 'DH      SG 136      BOM      (20:15)       (22:20)      DEL  FLT     SG 11       DEL      (08:55)       (12:50)      DXB  FLT     SG 14       DXB      (14:00)       (16:55)      BOM  
 ' AS x UNION SELECT 
 'DH: SG 282 MAA-AMD 12:13 28-Nov-2013 14:38 28-Nov-2013, FLT :SG 345 AMD-PNQ 21:34 22:55, FLT :SG 345 PNQ-BLR 23:39 01:05
 ' AS x ) data

结果:

(No column name)    X
20:15   DH      SG 136      BOM      (20:15)       (22:20)      DEL  FLT     SG 11       DEL      (08:55)       (12:50)      DXB  FLT     SG 14       DXB      (14:00)       (16:55)      BOM     
12:13   DH: SG 282 MAA-AMD 12:13 28-Nov-2013 14:38 28-Nov-2013, FLT :SG 345 AMD-PNQ 21:34 22:55, FLT :SG 345 PNQ-BLR 23:39 01:05   

【讨论】:

    【解决方案2】:

    也许你让这个要求比它需要的更复杂。只取(第一次出现后的前五个字符:

    SELECT SUBSTRING(col, CHARINDEX('(', col) + 1, 5)
    FROM yourTable;
    

    Demo

    【讨论】:

    • 只是补充一点,如果你不能依赖第一次出现的 ( 但可以依赖第一次出现的 : 那么它几乎相同,只需将 +1 更改为 -2跨度>
    • @Bee_Riii 但后来它变成了一场猫捉老鼠的游戏,因为: 可能首先出现在其他上下文而不是时间:-)
    • 同意。我指出,如果他们的锚点是 : ,您的简化很容易修改,这可能暗示用户在他们的查询中使用它。
    猜你喜欢
    • 1970-01-01
    • 2016-01-04
    • 2011-03-31
    • 1970-01-01
    • 2023-01-04
    • 2020-01-26
    • 1970-01-01
    • 2015-08-26
    • 2013-06-26
    相关资源
    最近更新 更多