【发布时间】:2013-03-05 10:52:02
【问题描述】:
我知道关于这个话题有很多问题,甚至是我不久前问过自己的一个 (here)。现在我遇到了一个不同的问题,我自己和我的同事都不知道这种奇怪行为的原因是什么。
我们有一个相对简单的 SQL 语句,就像这样:
SELECT
CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) AS MyDate,
SomeOtherColumn,
...
FROM
MyTable
INNER JOIN MyOtherTable
ON MyTable.ID = MyOtherTable.MyTableID
WHERE
MyTable.ID > SomeValue AND
MyText LIKE 'Date: %'
这不是我的数据库,也不是我的 SQL 语句,而且我没有创建出色的架构来将日期时间值存储在 varchar 列中,所以请忽略这一点。
我们现在面临的问题是 SQL 转换错误 241(“从字符串转换日期和/或时间时转换失败。”)。
现在我知道查询优化器可能会更改执行计划,在尝试转换后可以使用 WHERE 子句过滤结果,但真正奇怪的是,当我删除所有WHERE 子句。
当我在上面的语句中添加一行时,我也没有收到任何错误,如下所示:
SELECT
MyText, -- This is the added line
CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) AS MyDate,
...
一旦我删除它,我就会再次收到转换错误。手动检查 MyText 列中的值而不尝试转换它们并不表明存在任何可能导致问题的记录。
转换错误的原因是什么?当我也在 SELECT 语句中选择列时,为什么我没有遇到它?
更新
这里是执行计划,虽然我认为它不会有帮助。
【问题讨论】:
-
运行查询
without where子句时first row的myText列的值是多少? -
当您的
LIKE子句保证MyText以Date:开头 时,为什么要CHARINDEX('Date:', MyText)? -
@Kaf:数据类似于:Ping 未达到 11.22.33.44:11.22.33.44 可达 0% 1.尝试日期:31.12.2000 12:34:56 IP:11.22.33.44 它产生这个的不是我的东西。
-
@Damien:我知道,但这就是“开发”的方式,但无论如何转换错误都没有关系。
-
我认为这是您的数据。很容易确认您是否可以给我们一个 fiddle,它可以在没有 where 的情况下运行并在 where 失败。
标签: tsql datetime type-conversion