【问题标题】:SQL Server Datetime Subquery Conversion Error?SQL Server 日期时间子查询转换错误?
【发布时间】:2010-12-08 06:17:41
【问题描述】:

无法理解为什么当我的子查询正确过滤掉错误的日期数据(用户在实际查询中输入)但当我将子查询的结果(具有干净的日期)转换回日期时间时查询失败条款。我已经包含了一个失败的无表格示例。在这件事上花了很长时间——讨厌生活。

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'

【问题讨论】:

  • 如果您发布代码或 XML,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!

标签: sql-server datetime casting


【解决方案1】:

如果您使用的是查询分析器,请转到查询菜单并选择“显示估计的执行计划”,或按 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'

【讨论】:

  • 不能使用临时表,因为这个 SQL 存在于缩放器 UDf 中......但是 where 子句确实有效!谢谢!
【解决方案2】:

看起来这也有效。感谢大家的帮助!

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'

【讨论】:

  • 如果您发布代码或 XML,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!
猜你喜欢
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 2016-10-16
  • 2019-08-03
相关资源
最近更新 更多