SQL Server日期时间子查询转换错误?

问题描述:

无法理解为什么当我的子查询正确过滤出错误的日期数据(用户输入的是真实查询),但是当我将子查询的结果(干净日期)转换回where子句的日期时间时,查询失败。我列出了一个无法显示的示例。花了很长时间在这个迄今为止讨厌的生活。SQL Server日期时间子查询转换错误?

select 
date_test 
from 
(
select 
    date_test 
from 
(
    select 
    '01/01/1980' as date_test 
    union select 
    'a' 
) as qry_bad_date 
where 
    ISDATE(date_test) = 1 
) as qry_only_valid_date 
where 
cast(date_test as datetime) = '01/01/1980' 
+0

如果您发布的代码或XML,** **请在高亮文本编辑器的线和编辑器工具栏上的“代码”按钮(101 010)点击很好的格式和语法高亮显示! – 2010-12-08 07:33:06

如果您使用查询分析器,进入查询菜单,选择“显示估计的执行计划”,或按CTRL + L。 Sql Server的查询优化器已经决定,比较date_test到你指定的日期在食物链上属于更高的。如果添加ISDATE检查您的where子句中正常工作:

select date_test 
from (select date_test 
     from (select '1980/01/01' as date_test 
       union 
       select 'a' 
      ) as qry_bad_date 
     where ISDATE(date_test) = 1 
    ) as qry_only_valid_date 
where ISDATE(date_test) = 1 and cast(date_test as datetime) = '1980/01/01' 

如果使用临时表或表变量来强制查询执行单独它也可以工作:

declare @dt1 table (date_test varchar(20)) 
declare @dt2 table (date_test varchar(20)) 
insert @dt1 select '1980/01/01' union select 'a' 
insert @dt2 select date_test from @dt1 where ISDATE(date_test) = 1 
select date_test 
from @dt2 
where cast(date_test as datetime) = '1980/01/01' 
+0

不能使用临时表,因为这个SQL存在于Scaler UDf内部......但是where子句确实可行!谢谢! – 2010-12-08 06:56:47

貌似这个也起作用。感谢所有的帮助!

select 
    date_test 
from 
(
    select 
     case isdate(date_test) when 1 then CAST(date_test as datetime) else null end as date_test 
    from 
    (
     select 
      '1980/01/01' as date_test 
     union select 
      'a' 
    ) as qry_bad_date 
    where 
     ISDATE(date_test) = 1 
) as qry_only_valid_date 
where 
    cast(date_test as datetime) = '1980/01/01' 
+0

如果您发布代码或XML,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010)以精确地设置格式并对其进行语法突出显示! – 2010-12-08 07:33:22