SQL Server在使用有效字符串将字符串转换为datetime时失败

时间:2014-08-06 11:09:43

标签: sql sql-server datetime

我正在将一些旧的,可怕格式的数据迁移到新系统,并从字符串列中的大量数据中提取到期日期。它的格式为<Something>Data</>(不是我做的,我会添加!)

我需要提取的一个要素是到期日期/时间。我这样做:

SELECT convert(datetime,
  SUBSTRING(EventData,
            CHARINDEX('<ExpiryDate>', EventData, 0) + 12,
            CHARINDEX('</>', EventData, CHARINDEX('<ExpiryDate>', EventData, 0)) - (CHARINDEX('<ExpiryDate>', EventData, 0) + 12)
  ),
  103)

这在大多数情况下工作正常,虽然有点慢,但在某些数据上我得到错误:

  

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

如果子字符串返回格式错误的日期/时间,这将是有意义的,但它们对我来说似乎都很好。确保订单,处理以下行,最后一次失败:

<ExpiryDate>22/03/2010 17:00:00</>
<ExpiryDate>22/03/2010 17:00:00</>
<ExpiryDate>22/03/2010 17:00:00</>
<ExpiryDate>22/03/2010 17:00:00</>

子字符串很乐意按如下方式解析它们:

22/03/2010 17:00:00
22/03/2010 17:00:00
22/03/2010 17:00:00
22/03/2010 17:00:00

有没有理由说这四个中的最后一个会失败?或者是否有更强大的方法来解析它们?

编辑:更多的调查显示出一种奇怪的现象:如果我没有CONVERT()内联,而只是分配子串的输出,并将其用作CTE然后执行CONVERT(),它工作得很好。数据类型感觉不舒服。

1 个答案:

答案 0 :(得分:0)

我在SQL Server 2012上试过它,工作得很完美。 CONVERT日期格式103是正确的。以下代码是否适用于您的数据库?

DECLARE @MyString CHAR(100)
SET @MyString = '<ExpiryDate>22/03/2010 17:00:00</>'

SELECT convert(datetime,
  SUBSTRING(@MyString,
        CHARINDEX('<ExpiryDate>', @MyString, 0) + 12,
        CHARINDEX('</>', @MyString, CHARINDEX('<ExpiryDate>', @MyString, 0)) -        
         (CHARINDEX('<ExpiryDate>', @MyString, 0) + 12)
  )
,  103)