Sql server Varchar到Datetime转换错误-在SELECT中很好,但在WHERE中中断

Sql server Varchar到Datetime转换错误-在SELECT中很好,但在WHERE中中断,sql-server,Sql Server,我有一个简单的CTE,可以从表中提取日期-日期(ApptDateTime)以YYYY-MM-DDZHH:MM:SS格式存储。有些列有空值,所以我想忽略它们,以及任何不是日期的列 如果我这样做: ;WITH cte AS (SELECT urn, CONVERT(DATETIME, ApptDateTime) AS ApptDateTime FROM data WHERE ISDATE(ApptDateTime) = 1 ) SELECT

我有一个简单的CTE,可以从表中提取日期-日期(
ApptDateTime
)以
YYYY-MM-DDZHH:MM:SS
格式存储。有些列有空值,所以我想忽略它们,以及任何不是日期的列

如果我这样做:

;WITH cte
AS
(SELECT
        urn,
        CONVERT(DATETIME, ApptDateTime) AS ApptDateTime

    FROM data
    WHERE ISDATE(ApptDateTime) = 1  
)

SELECT
    *
FROM cte
ORDER BY ApptDateTime
。。。这很好用;我得到了一份按日期排序的记录列表。但是,如果我只想看到今天之前的日期,并引入
WHERE

;WITH cte
AS
(SELECT
        urn,
        CONVERT(DATETIME, ApptDateTime) AS ApptDateTime

    FROM data
    WHERE ISDATE(ApptDateTime) = 1  
)

SELECT
    *
FROM cte
WHERE ApptDateTime < GETDATE()
ORDER BY ApptDateTime

尝试添加如下条件:
WHERE(当ISDATE(ApptDateTime)=1然后ApptDateTime ELSE为空结束时的情况)

几天前,我遇到了同样的问题,通过添加
案例解决了这个问题。
不清楚SQL如何执行where条件。
我还需要找到实际的原因。如果我发现任何东西,我会在同一个帖子

编辑:如果您在实际查询的执行计划中看到,它将显示导致错误的ISDATE(ApptDateTime)=1之前的ApptDateTime

原因是WHERE子句不遵循短路规则。Ref:

可能空值是个问题,您是否尝试过类似where isnull(ApptDateTime,'20990101')AppDateTime IS NOT NULL
添加到CTEit中的
where
子句中。这应该不会有什么区别,但您尝试过where ApptDateTimeISDATE()之前不会尝试执行比较)函数调用。不幸的是,他们会修复它的迹象很少。如果您使用的是SQL Server 2012或更高版本,您可以使用
TRY\u CONVERT
调用来包装对列的所有访问,然后只允许您处理数据或
NULL
s。是的,这很有效!谢谢,谢谢大家的评论,我已经学会了我是新来的。
SELECT
    urn,
    convert(datetime,ApptDateTime) as ApptDateTime
    into #temp FROM data
    WHERE ISDATE(ApptDateTime) = 1  


SELECT
    *
FROM #temp
WHERE ApptDateTime < getdate()
ORDER BY ApptDateTime

DROP TABLE #temp