Question

J'ai une procédure stockée qui prend comme paramètre un Varchar qui doit être considéré comme un dateheure pour une utilisation ultérieure :

SET @the_date = CAST(@date_string AS DATETIME)

Je m'attends à ce que la chaîne de date soit fournie au format "JJ-MON-AAAA", mais dans un effort de code défensif, si pour une raison quelconque elle ne peut pas être convertie avec succès, je souhaite utiliser par défaut la date système et continuer.En PL/SQL, je pourrais utiliser la gestion des exceptions pour y parvenir et je pourrais également le faire assez facilement avec des expressions régulières, mais la correspondance de modèles limitée prise en charge par Sybase ne me permet pas de le faire et je ne peux pas compter sur bibliothèques ou extensions tierces.Existe-t-il un moyen simple de procéder en T-SQL ?

Attention :en utilisant Sybase ASE 12.5.3, il n'y a pas de fonction ISDATE

Était-ce utile?

La solution

J'ai un problème similaire.Vous pourrez peut-être 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 une sélection.Cela fonctionnera bien dans un curseur (boo) ou en logique avant/après un batch SQL.

Autres conseils

Mon Dieu, si la question concernait Microsoft SQL Server, nous aurions été en affaires !

Sybase, malheureusement, est une toute autre base de données de nos jours, depuis environ 1997, en fait, à un an près.

Si le format d'entrée doit simplement être « JJ-MON-AAAA » et sans exception, alors je pense qu'une bonne quantité de validation a été obtenue en découpant l'entrée à l'aide de SUBSTR(), après avoir d'abord effectué quelques choses simples, comme vérifier la longueur. .

Je pensais cependant que les versions récentes de Sybase (SQL Anywhere 11, par exemple) prenaient en charge les expressions régulières, même si cela faisait un moment que je n'avais pas eu à subir T-SQL.Certaines recherches sur Google me laissent un peu plus de doute.

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

Vous pourriez probablement utiliser ce comme point de départ.

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

?

Trouvé ceci dans le deuxième résultat dans Google lors de la recherche de "valider la chaîne de date SQL".

----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)

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

SET DATEFORMAT mdy;

As-tu essayé convert au lieu de cast?

select convert( datetime , @date_string ) 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top