【问题标题】:Convert unusual string format to Datetime in SQL在 SQL 中将异常字符串格式转换为日期时间
【发布时间】:2016-11-01 09:52:26
【问题描述】:

我收到这种格式的日期:Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)

将字符串按原样转换为datetime,或将其缩减到足以进行转换(例如Jun 29 2016 15:57:45)而不会有丢失数据的风险的最佳方法是什么?

【问题讨论】:

  • 存储日期时间字符串的最佳方式是使用Datetime 数据类型。永远不要将其存储为字符串,解析时会很痛苦
  • 是的,我想把它转换成Datetime
  • 基于 CLR 正则表达式的转换函数。
  • 一切都是 GMT 0100 还是代表不同的时区?如果不同的区域我不想在转换过程中松开该部分,并且会使用 DATETIMEOFFSET 或转换为 DATETIMEOFFSET 然后转换为本地时间作为 DATETIME......

标签: sql sql-server sql-server-2008 datetime type-conversion


【解决方案1】:

如果您的字符串是固定长度的,并且您试图摆脱的左右部分不会增长或收缩,那么您应该这样做。

DECLARE @DateStr VARCHAR(100)
SET @DateStr = 'Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)'

SELECT CAST(LEFT(RIGHT(@DateStr,49),20) AS DATETIME)

【讨论】:

    【解决方案2】:

    试试这个:

    DECLARE @w VARCHAR(MAX)= 'Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)'
    
    SELECT CAST(SUBSTRING(@w, 4, (PATINDEX('%GMT%', @w)-4)) AS DATETIME)
    

    【讨论】:

      【解决方案3】:

      我会做这样的事情。它在charindex 中搜索字符串“GMT”的位置。然后它使用substring 将值拆分出来(忽略前4 个字符)并将结果转换为datetime

      样本数据

      CREATE TABLE #TestData (OriginalValue nvarchar(100))
      INSERT INTO #TestData (OriginalValue)
      VALUEs ('Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)')
      

      查询

      SELECT 
      OriginalValue
      ,CONVERT(datetime,SUBSTRING(OriginalValue,4,CHARINDEX('GMT',OriginalValue)-5)) NewValue
      FROM #TestData
      

      结果

      OriginalValue                                           NewValue
      Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)   2016-06-29 15:57:45.000
      

      【讨论】:

      • 当日期名称超过 3 个字符时可能会折腾
      • 除了星期三有超过三个字符。似乎 OP 使用三个字符值作为他的日期名称。
      • 总是使用 3 个字符。但不是我选择了这种疯狂的日期格式,我只是坚持下去。
      • @Matt - 为什么有趣,如果使用三个字符,那么星期四实际上是星期四似乎是合乎逻辑的。这不是火箭科学朋友。我如何再次对 cme​​ts 投反对票?这是一个主要的候选人。
      • OP已经确认天名用了三个字符,用哪三个字母有关系吗?此外,该命名约定是我见过的唯一一个在任何地方都使用过的命名约定,为什么会是其他的呢?最后,您可以使用@Matt 标记您提出问题的任何人
      【解决方案4】:

      使用SubstringCharindex 字符串函数修剪日期时间

      试试这个

      declare @date_str varchar(100) = 'Wed Jun 29 2016 15:57:45 GMT 0100 (GMT Daylight Time)'
      
      select cast(substring(@date_str,charindex(' ',@date_str),charindex('GMT',@date_str)-charindex(' ',@date_str)) as datetime)
      

      结果: 2016-06-29 15:57:45.000

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多