2014-06-11 4 views
0

J'ai un champ dans une base de données SQL Server qui est de type string. Ce champ est utilisé pour différentes choses pour différents clients. Nous stockons des dates dans ce champ pour un client. Lorsque le champ n'est pas chargé, il est vide (chaîne vide). J'ai besoin d'extraire les données de ce champ pour ce client et de l'utiliser dans mon instruction where. Je pensais que ce serait une simple question de couler la valeur à ce type de données, mais j'obtiens l'erreurconvertir une chaîne vide à datetime

'La conversion a échoué lors de la conversion de la date et/ou de l'heure de la chaîne de caractères.

Voici l'extrait de code: where boldet.detmisc1 >= @begin.
J'ai essayé les suivantes:

where cast(boldet.detmisc1 as date) >= @begin

where cast(isnull(nullif(boldet.detmisc1, ''), ‘’) as date) >= @begin

Est-il possible de convertir une valeur de chaîne vide à une valeur datetime nulle pour que je puisse l'utiliser dans mon où la déclaration?

Base de données: SQL Server 2012

Je joins toute requête dans le cas où quelque chose d'autre est à l'origine de l'erreur:

declare @begin datetime 
set @begin = dateadd(dd, datediff(dd, 0, GETDATE()) - 1, 0) 
declare @stop datetime 
set @stop = dateadd(dd, datediff(dd, 0, GETDATE()), 0) 
; 
with a as (select boldet.BOL_Key 
--boldet.DetMisc1 

from ProBillTBL pro WITH (NOLOCK) 
    INNER JOIN BOLTBL bol WITH (NOLOCK) On Pro.ProBill_Key = Bol.ProBill_Key 
    INNER JOIN BOLDetailTBL boldet WITH (NOLOCK) On Bol.BOL_Key = BolDet.BOL_Key 
    INNER JOIN ClientLocTBL cliloc WITH (NOLOCK) On Pro.ClientLoc_Key = Cliloc.ClientLoc_Key 
    INNER JOIN CarrierTBL car WITH (NOLOCK) On Pro.Carrier_Key = Car.Carrier_Key 
    --left outer join support sup (nolock) on pro.probill_key = sup.probill_key  

where cliloc.ClientLoc_Key = 2519 
    and boldet.DetMisc3 in ('1', '4', '5') 
    and (pro.ProEnteredDate >= @begin) 

    or (cast((case when boldet.detmisc1 = '' then NULL else boldet.detmisc1 end) as date) >= @begin)) 


select * from a 

Quand je commente cette section (cast((case when boldet.detmisc1 = '' then NULL else boldet.detmisc1 end) as date) >= @begin) je reçois un résultat, mais avec cela dans la clause où j'obtiens l'erreur.

Répondre

2

Essayez ceci:

WHERE 
    CAST((CASE WHEN boldet.detmisc1 = '' THEN NULL ELSE boldet.detmisc1 END) 
    As Date) >= @begin 
+0

Je reçois toujours la même erreur. J'ai modifié mon post pour inclure la requête entière. –

+2

Peut-être que ce n'est pas juste une chaîne vide mais d'autres valeurs de date invalides. – Magnus

+0

Magnus, ma première réaction a été "Non, ce n'est probablement pas ça" Cependant, j'ai vérifié et trouvé 2 valeurs sur le terrain qui étaient des entrées invalides.Merci de m'avoir invité à vérifier (quelque chose que j'aurais dû faire). –