从字符串转换日期和/或时间时转换失败[错误随顶部(xxxx)消失]



环境:

  • Ubuntu 16.04上的SQL Server 14 Express
  • SQL Server Management Studio 17.4版

我观察到一个非常令人厌烦的问题,但我相信有一个解释。当我尝试运行以下SQL命令时:

SELECT * 
FROM  
(SELECT 
CONVERT(DATE, clinicaldate, 6) AS NEWDATE, 
[id], 
[DateCreated] ... 
FROM
myDatabase) t1 
WHERE  
t1.newdate BETWEEN CONVERT(DATETIME, '01/09/2015', 103) 
AND CONVERT(DATETIME, '30/09/2015', 103) 

我得到以下错误:

关键字"convert"附近的语法不正确

但是,如果在select中使用top (XXX),则一切正常。请注意,总记录不到500000,这意味着我实际上选择了所有记录。

SELECT * 
FROM  
(SELECT TOP(500000) 
CONVERT(DATE, clinicaldate, 6) AS NEWDATE, 
[id], 
[DateCreated] ... 
FROM
myDatabase) t1 
WHERE  
t1.newdate BETWEEN CONVERT(DATETIME, '01/09/2015', 103) 
AND CONVERT(DATETIME, '30/09/2015', 103) 

列中的日期无效。它不在使用top时选择的行中,因此该问题很少见。

不要对常量使用convert()。只需使用:

WHERE  t1.newdate BETWEEN '2015-09-01' AND '2015-09-30'

更易于书写和阅读。(需要注意的是:有一个国际化设置需要去掉连字符(。

然后,使用try_convert():查找有问题的日期

select clinicaldate
from t
where try_convert(DATE, clinicaldate, 6) is null;

您可以使用try_convert()而不是convert()来修复数据错误,但最好修复数据。

最新更新