我有一个表格Col
列可能包含或不包含字符串' geb。'。如果是这样,我想提取以下10个字符并将其转换为DATETIME
这是我的疑问:
;WITH CTE AS
(
SELECT
TOP 100000000
Col,
CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd
FROM
T
WHERE
Col LIKE '%geb.%'
)
SELECT
Col,
bd
FROM
CTE
WHERE
bd <= '01.01.1950'
以上查询工作正常。当我省略TOP xxx
语句并且WHERE子句在任何方式中包含bd
(IS NULL,= /!=&#39;&#39;,...)时,我收到转换错误:
从字符串
转换日期和/或时间时转换失败
当我在WHERE子句中包含TOP xxx
或删除bd
时,查询完成且没有错误。
这里发生了什么?
答案 0 :(得分:1)
这是因为当您不使用TOP
条款或WHERE
条件时,您最终会尝试转换某些col
值'geb.'
后面的字符不能转换为DateTime
您正使用DateTime
或select
条款 <来自TOP
列表中的非WHERE
可兑换值 / p>
使用TRY_CONVERT代替:
TRY_CONVERT ( data_type [ ( length ) ], expression [, style ] )
使用:
TRY_CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd
而不是:
CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd