2010-03-16 6 views
2

Je cherche quelque chose comme TRYCAST dans TSQL ou une méthode équivalente/hack.Fonte de date indicative dans tsql

Dans mon cas, j'extrais des données de date d'une colonne xml.

La requête suivante lève "Arithmetic overflow error converting expression en type de données datetime". si la donnée trouvée dans le fichier xml ne peut pas être convertie en datetime (dans ce cas précis, la date est "0001-01-01" dans certains cas). Existe-t-il un moyen de détecter cette exception avant qu'elle ne se produise?

select 
     [CustomerInfo].value('(//*:InceptionDate/text())[1]', 'datetime') 
    FROM Customers 

Un exemple de ce que je suis en train de réaliser en pseudocode avec une fonction tsql imaginé TRYCAST(expr, totype, defaultvalue):

select 
     TRYCAST(
     [CustomerInfo].value('(//*:InceptionDate/text())[1]', 'nvarchar(100)'), 
     datetime, 
     null) 
    FROM Customers 

Répondre

3

Vous pouvez essayer hors le nœud quand il est inférieur au datetime minimum SQL Server permet de:

SELECT 
    [CustomerInfo].value('(//*:InceptionDate/text())[1][.>=''1753-01-01'']', 'datetime') 
FROM 
    Customers 

Une façon moins assomptive de le faire serait:

SELECT 
    CASE 
    WHEN ISDATE([CustomerInfo].value('(//*:InceptionDate/text())[1]')) 
    THEN CONVERT(DATETIME, [CustomerInfo].value('(//*:InceptionDate/text())[1]')) 
    ELSE NULL 
    END 
FROM 
    Customers 
+0

Ce n'est pas une solution très générale, mais cela fonctionne très bien dans ce cas précis, donc je réponds comme réponse – Tewr

+1

''(...) [.> =' '1753-01-01' 'et. <= '' 9999-12-31 ''] ',' datetime'' est une solution légèrement plus cohérente. – Tewr

+0

@Tewr: Peut-être que vous aimez la deuxième version pour le faire mieux. – Tomalak