环境:
- 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()
来修复数据错误,但最好修复数据。