2010-12-08 4 views
0

Impossible de comprendre pourquoi lorsque ma sous-requête filtre correctement les données de date incorrecte (utilisateur entré dans la requête réelle) mais que la requête échoue lorsque je renvoie les résultats de la sous-requête (qui contient des dates propres) à la date . J'ai inclus un exemple sans tableau qui échoue. J'ai passé beaucoup de temps sur cette vie jusqu'ici - haïr.Erreur de conversion de sous-requête SQL Server Datetime?

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

Si vous publiez code ou XML, ** S'il vous plaît ** mettre en évidence les lignes dans l'éditeur de texte et cliquez sur le bouton « code » (101 010) sur la barre d'outils de l'éditeur pour mettre en forme bien et la syntaxe mettre en évidence! –

Répondre

1

Si vous utilisez l'Analyseur de requêtes, allez dans le menu requête, puis sélectionnez « plan d'exécution estimé d'affichage », ou appuyez sur CTRL + L. L'optimiseur de requêtes de Sql Server a décidé que la comparaison de date_test à la date spécifiée appartient plus à la chaîne alimentaire. Si vous ajoutez le ISDATE chèque à votre clause where il fonctionne très bien:

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' 

Si vous utilisez des tables temporaires ou des variables de table pour forcer les requêtes à exécuter séparément, il fonctionne aussi:

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

Impossible d'utiliser les tables temporaires car ce code SQL se trouve dans l'espace de conversion UDf ... Mais la clause where fonctionne! Je vous remercie! –

0

se présente comme suit fonctionne aussi. Merci pour votre aide!

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

Si vous envoyez un code ou un code XML, ** veuillez ** mettre en surbrillance ces lignes dans l'éditeur de texte et cliquer sur le bouton "code" (101 010) dans la barre d'outils de l'éditeur pour le mettre en valeur! –

Questions connexes