Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[SQL Server 2000] Conversion nombres > chaine > date

2 réponses
Avatar
Stephane Faure
Bonjour,

J'hérite d'une application ASP bien mal conçue, dans laquelle les dates
sont stockées dans une base SQL Server 2000 sous forme de 3 champs de type
int : un pour le jour, un pour le mois, un pour l'année sur 4 chiffres. Il
s'agit de dates de passage de tests, pour lesquelles il faut calculer une
date d'échéance à partir d'une durée de validité spécifiée dans un autre
champ. Voici la requête que j'avais initialement faite avec SQL Server
2005, mais qui ne marche pas dans la version 2000 (c'est la dernière ligne
qui nous intéresse) :

=========
UPDATE bilan_test SET etat_permis='valide'
WHERE (test_ok=2 OR test_force=1)
AND (DATEADD(MONTH, nb_mois_validite, CAST(jour_test AS varchar) +'/'+
CAST(mois_test AS varchar) +'/'+ CAST(an_test AS varchar) ) >= GETDATE() )
=========

J'obtiens ce message d'erreur :
"La conversion d'un type de données CHAR en type DATETIME a donné une
valeur hors des limites des valeurs de date et d'heure.
L'instruction a été arrêtée."

Pourtant, quand je teste la chaine produite avec la fonction ISDATE(), le
résultat est positif, j'obtiens des 1 partout avec ceci :

==============
SELECT ISDATE(CAST(jour_test AS varchar) +'/'+ CAST(mois_test AS varchar)
+'/'+ CAST(an_test AS varchar))
FROM bilan_test
==============

J'ai esssayé en changeant l'ordre de concaténation (année puis mois puis
jour), en paramétrant la variable DATEFORMAT à DMY, sans rien obtenir de
mieux. L'OS est un Windows XP Pro français, SQL Server 2000 SP4 est en
français aussi. Qu'est-ce qui cloche avec SQL Server 2000 ??

2 réponses

Avatar
Stephane Faure
"Stephane Faure" a écrit dans le message de
news: 46728580$0$17523$

Pourtant, quand je teste la chaine produite avec la fonction ISDATE(),
le résultat est positif, j'obtiens des 1 partout avec ceci :



Oups ! J'avais regardé un peu trop en vitesse, certain enregistrements ont
une date invalide (ISDATE renvoie 0). Par contre je ne sais pas comment
intégrer dans la requête un test vérifiant que les dates sont valides,
avant que la conversion en DATETIME ne s'effectue. Ca marche quand la
conversion est faite dans le SELECT, mais pas quand elle est faite dans le
WHERE. Ainsi :

======================= SELECT num_test, DATEADD(MONTH, nb_mois_validite, CAST(jour_test AS
varchar) +'/'+ CAST(mois_test AS varchar) +'/'+ CAST(an_test AS varchar) )
FROM bilan_test
WHERE ISDATE(CAST(jour_test AS varchar) +'/'+ CAST(mois_test AS varchar)
+'/'+ CAST(an_test AS varchar)) = 1
=======================
marche, mais pas

======================= SELECT num_test
FROM bilan_test
WHERE ISDATE(CAST(jour_test AS varchar) +'/'+ CAST(mois_test AS varchar)
+'/'+ CAST(an_test AS varchar)) = 1
AND DATEADD(MONTH, nb_mois_validite, CAST(jour_test AS varchar) +'/'+
CAST(mois_test AS varchar) +'/'+ CAST(an_test AS varchar) ) >= GETDATE()
======================= qui me renvoie toujours ce message d'erreur : "La conversion d'un type de
données CHAR en type DATETIME a donné une valeur hors des limites des
valeurs de date et d'heure."

Bon, je crois que je vais faire ça dans le code ASP...
Avatar
Patrice
Peut-être avec un CASE :

CASE <Condition> THEN Expression1 ELSE Expression2 END pour renvoyer NULL ou
la date selon le cas...

--
Patrice


"Stephane Faure" a écrit dans le message de news:
46729cb2$0$21546$
"Stephane Faure" a écrit dans le message de
news: 46728580$0$17523$

Pourtant, quand je teste la chaine produite avec la fonction ISDATE(), le
résultat est positif, j'obtiens des 1 partout avec ceci :



Oups ! J'avais regardé un peu trop en vitesse, certain enregistrements ont
une date invalide (ISDATE renvoie 0). Par contre je ne sais pas comment
intégrer dans la requête un test vérifiant que les dates sont valides,
avant que la conversion en DATETIME ne s'effectue. Ca marche quand la
conversion est faite dans le SELECT, mais pas quand elle est faite dans le
WHERE. Ainsi :

======================= > SELECT num_test, DATEADD(MONTH, nb_mois_validite, CAST(jour_test AS
varchar) +'/'+ CAST(mois_test AS varchar) +'/'+ CAST(an_test AS varchar) )
FROM bilan_test
WHERE ISDATE(CAST(jour_test AS varchar) +'/'+ CAST(mois_test AS varchar)
+'/'+ CAST(an_test AS varchar)) = 1
======================= >
marche, mais pas

======================= > SELECT num_test
FROM bilan_test
WHERE ISDATE(CAST(jour_test AS varchar) +'/'+ CAST(mois_test AS varchar)
+'/'+ CAST(an_test AS varchar)) = 1
AND DATEADD(MONTH, nb_mois_validite, CAST(jour_test AS varchar) +'/'+
CAST(mois_test AS varchar) +'/'+ CAST(an_test AS varchar) ) >= GETDATE()
======================= > qui me renvoie toujours ce message d'erreur : "La conversion d'un type de
données CHAR en type DATETIME a donné une valeur hors des limites des
valeurs de date et d'heure."

Bon, je crois que je vais faire ça dans le code ASP...