【问题标题】:Get DateTime from from a text in SQL Server从 SQL Server 中的文本获取 DateTime
【发布时间】:2022-01-20 14:17:06
【问题描述】:

如何从字符串中分离并只显示日期时间?

我有一列包含这些数据:

Comments
-----------------------------------------
Daniel reached the school by 9:25:00 alone
Breakfast was served by 10:17:27 in the morning
Reached back home late evening by 7:00:48

我用这个查询来分隔时间:

(CONVERT(varchar(max), Comments, 108)) [Comments],

它返回了相同的行。字符串没有被过滤

当我尝试使用此语句时:

(CONVERT(TIME, Comments, 108)) [Comments],

我收到了这个错误

从字符串转换日期和/或时间时转换失败。

我怎样才能克服时间并获得以下预期结果?

Comments
----------------------------------------
9:25:00 
10:17:27 
7:00:48

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    使用 patindex,您可以定位时间模式。

    select
    try_cast(substring(Comments, patindex('%[ 0-9][0-9]:[0-9][0-9]:[0-9][0-9]%', Comments), 8) as time(0)) CommentTime
    from your_table
    
    CommentTime
    09:25:00
    10:17:27
    07:00:48

    【讨论】:

      【解决方案2】:

      您可以使用STRING_SPLITTRY_CONVERT

      SELECT Tbl.Comments, T.value
      FROM Tbl CROSS APPLY STRING_SPLIT(Tbl.Comments,' ') As T
      WHERE TRY_CONVERT(TIME, value) IS NOT NULL
      

      对于不支持STRING_SPLIT的版本,同样的逻辑可以使用XML实现,因为已经有使用PATINDEX的解决方案了。

      WITH cte AS (
      SELECT Comments, CONVERT(XML, CONCAT('<n>',REPLACE(Comments,' ','</n><n>'),'</n>')) AS x
      FROM Tbl)
      SELECT cte.Comments, v.value('.','varchar(MAX)')
      FROM cte CROSS APPLY x.nodes('/n') AS t(v)
      WHERE TRY_CONVERT(TIME, v.value('.','varchar(MAX)')) IS NOT NULL
      

      【讨论】:

      • string_split 在 SQL Server 2012 中不存在。
      • @Austin 我没有注意到这个标签。我在没有使用 STRING_SPLIT 的情况下实现了相同的逻辑,但为了感兴趣。
      • 一切都好,你已经得到了我的 +1。
      【解决方案3】:
      ltrim(substring(comments, charindex(comments, ':') - 2, 8))
      

      显然,这假设总是有一个冒号并且第一个冒号在时间元素内。它还假设所有时间都有前导空格并且长度为 7-8 个字符。根据您打算对此做什么,ltrim() 可能是不必要的。

      这只是字符串解析。我意识到这实际上并没有转换为时间值,因为不清楚 OP 在输出中是否需要它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-21
        • 2014-07-12
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多