我正在将一些旧的,可怕格式的数据迁移到新系统,并从字符串列中的大量数据中提取到期日期。它的格式为<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(),它工作得很好。数据类型感觉不舒服。
答案 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)