2008-08-12 41 views
2

J'ai une procédure stockée qui prend comme paramètre un varchar qui doit être jeté comme pour une utilisation ultérieure datetime:Meilleure méthode pour la validation de la date varchar dans Sybase (T-SQL)?

SET @the_date = CAST(@date_string AS DATETIME) 

J'attends la chaîne de date à fournir au format "DD-MON-YYYY", mais dans un effort de codage défensif, si pour une raison quelconque, il ne peut pas être lancé avec succès, je veux par défaut à la date du système et continuer. En PL/SQL, je pourrais utiliser la gestion des exceptions pour y parvenir et je pourrais le faire assez facilement avec des expressions régulières, mais la mise en correspondance des modèles limitée supportée par Sybase ne me laisse pas faire et je ne peux pas compter bibliothèques ou extensions tierces. Existe-t-il un moyen simple de le faire en T-SQL?

NB: Sybase ASE 12.5.3 à l'aide, il n'y a pas de fonction ISDATE

Répondre

1

J'ai un problème similaire. Vous pourriez être en mesure de faire quelque chose comme ceci:

SET arithabort arith_overflow off 
SET @the_date = CAST(@date_string AS DATETIME) 
IF @the_date is NULL 
    set @the_date = getdate() 
SET arithabort arith_overflow on 

Cependant, cela ne fonctionne pas bien dans un select. Cela fonctionnera bien dans un curseur (boo) ou dans la logique avant/après un batch SQL.

+0

Cela fonctionne assez bien pour mes besoins, merci! – ninesided

+0

Je confirme que cela ne fonctionne pas dans un select. Je ne comprends pas ce que vous entendez par "logique avant/après un batch SQL" Qu'est-ce qu'une logique dans sybase? –

0

Trouvé this in the second result dans Google lors de la recherche pour "valider sql chaîne de date".

----Invalid date 
SELECT ISDATE('30/2/2007') 
RETURNS : 0 (Zero) 
----Valid date 
SELECT ISDATE('12/12/20007') 
RETURNS : 1 (ONE) 
----Invalid DataType 
SELECT ISDATE('SQL') 
RETURNS : 0 (Zero) 
+0

IsDate n'est pas une fonction valide dans Sybase – ninesided

+0

Comment allez-vous voter contre moi pour quelque chose que vous avez ajouté après le fait. Et après j'ai répondu à la question.Le seul identifiant que vous avez eu était T-SQL, qui est le plus couramment utilisé dans Microsoft SQL Server, qui prend en charge ISDATE. Mauvaise étiquette. –

+0

Je pensais que le but de voter était d'indiquer une réponse qui n'a pas aidé, aidant les réponses qui ont aidé à atteindre le sommet, il ne voulait pas comme un léger – ninesided

0

Assurez-vous que SQL Server connaît l'ordre des jours, des mois et des années dans votre chaîne en exécutant

SET DATEFORMAT mdy; 
+0

Je ne suis pas si inquiet de l'ordre des parties de date, plus sur la validité de la chaîne de date elle-même. c'est-à-dire que je ne veux pas qu'il explose lorsque vous passez en '32 -DEC-2009 ', je veux qu'il soit par défaut à la date actuelle du système. – ninesided

1

Mon Dieu, si la question était sur Microsoft SQL Server alors nous aurions été Entreprise!

Sybase, malheureusement, est une toute base de données « utre ces jours-ci, depuis environ 1997, en effet, donner ou prendre un an. Si le format d'entrée doit simplement être 'DD-MON-YYYY' et aucune exception, alors je pense qu'une bonne quantité de validation a été obtenue en découpant l'entrée en utilisant SUBSTR(), après avoir fait quelques choses simples, comme vérifier la longueur. Je pensais que les versions récentes de Sybase (SQL Anywhere 11, par exemple) ont un support d'expression régulier, bien que cela fasse longtemps que je n'ai pas souffert de T-SQL. Un peu de googling me laisse plus de doutes.

1

Il semble que vous allez être obligé de rouler le vôtre.

Vous pouvez probablement utiliser this comme point de départ.

0

Avez-vous essayé convert au lieu de cast?

select convert(datetime , @date_string) 
+0

oui, en utilisant convertir ne fait aucune différence – ninesided

1

Tu ne peux pas faire quelque chose comme ceci:

SELECT @the_date = CASE @date_string 
         WHEN '[0-9][0-9]-[A-Z][A-Z][A-Z]-[0-9][0-9][0-9][0-9]' 
         THEN CONVERT(datetime, @date_string) 
         ELSE GETDATE() 
        END 

?

+0

qui ne garantirait pas que ce que vous obtenez est une date valide cependant, je pourrais passer 99-AAA-9999 à la fonction et il passerait cette vérification simple. Vous pouvez le rendre plus sophistiqué avec une déclaration de cas plus importante, mais lorsque vous commencez à penser aux années bissextiles et aux mois qui durent 30/31 jours, cela devient difficile. – ninesided

+0

convenu, c'est juste une simple validation, pas réel IsDate(), si cela vous convient, vous pouvez essayer de convertir le texte fourni en datetime, et vérifier, si la conversion a réussi en vérifiant @@ error variable, mais comme je l'ai dit, c'est demi-solution. à votre santé. – B0rG