2010-12-08 76 views
0

無法理解爲什麼當我的子查詢正確過濾出錯誤的日期數據(用戶輸入的是真實查詢),但是當我將子查詢的結果(乾淨日期)轉換回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

回答

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' 
+0

不能使用臨時表,因爲這個SQL存在於Scaler UDf內部......但是where子句確實可行!謝謝! – 2010-12-08 06:56:47

0

貌似這個也起作用。感謝所有的幫助!

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