[SQL SERVER] Récupérer la date la plus récente entre 2

Récupérer la date la plus récente entre 2 [SQL SERVER] - Programmation

Marsh Posté le 03-05-2001 à 10:55:57    

Salut :)
 
je cherche à récupérer (en une seule requête, pas de procédure) la date la plus récente entre deux dates dans des champs différents.
 
Merci d'avance :)


---------------
Force m'est de constater qu'il m'est de plus en plus difficile de faire coïncider mes levers tardifs et mes couchers anticipés par le biais de siestes prolongées... :D
Reply

Marsh Posté le 03-05-2001 à 10:55:57   

Reply

Marsh Posté le 03-05-2001 à 11:27:16    

up :??:


---------------
Chasser sans bière c'est comme... pêcher sans bière.
Reply

Marsh Posté le 03-05-2001 à 11:40:21    

Si ta version de SQL Server le permet, tu peux utiliser l'expression CASE.

Code :
  1. select "madate" =
  2.           case
  3.           when date1 <= date2 then date2
  4.           when date2 >  date1 then date1
  5. from
  6.        matable


 
Voilou.

Reply

Marsh Posté le 03-05-2001 à 11:42:42    

Fred999 a écrit a écrit :

Si ta version de SQL Server le permet, tu peux utiliser l'expression CASE.

Code :
  1. select "madate" =
  2.           case
  3.           when date1 <= date2 then date2
  4.           when date2 >  date1 then date1
  5. from
  6.        matable


 
Voilou.




merci fred999


---------------
Chasser sans bière c'est comme... pêcher sans bière.
Reply

Marsh Posté le 03-05-2001 à 11:43:07    

Fred999 a écrit a écrit :

Si ta version de SQL Server le permet, tu peux utiliser l'expression CASE.

Code :
  1. select "madate" =
  2.           case
  3.           when date1 <= date2 then date2
  4.           when date2 >  date1 then date1
  5. from
  6.        matable


 
Voilou.




 
 
ah ouais, c'est bon ça  :D  
 
Merci bôcoup Fred999, je vais essayer ça de ce pas  ;)


---------------
Force m'est de constater qu'il m'est de plus en plus difficile de faire coïncider mes levers tardifs et mes couchers anticipés par le biais de siestes prolongées... :D
Reply

Marsh Posté le 03-05-2001 à 11:55:01    

POPOPOP J'AI OUBLIE LE "END"

Code :
  1. select "madate" =
  2.           case
  3.           when date1 <= date2 then date2
  4.           when date2 >  date1 then date1
  5.           END
  6. from
  7.        matable


Désolé les gars.

Reply

Marsh Posté le 03-05-2001 à 11:58:48    

pour le "END", on avait corrigé de nous même (merci quand même :)
 
mais je suis toujours emmerdé passke SQL SERVER 7 veux pô faire d'aggrégas sur une sous-requête:
 
en bref, un fois que j'ai récupéré cette date, je fait un DATEDIFF dessus et sur un autre date, et le tout est placé dans un AVG, vois le bordel (c'est pour des stats)
 
Ex source:
 
SELECT AVG( DATEDIFF(  
  dd,  
  (SELECT "madate" = CASE
     when el_information_date <= sample_rec_date then sample_rec_date  
            when el_information_date > ample_rec_date then el_information_date  
       END
  FROM SSR),
  work_started_date
  )
)
FROM SSR
WHERE (sample_rec_date IS NOT NULL) AND  
    (work_started_date IS NOT NULL)AND (el_information_date IS NOT NULL)
 
 
je creuserai ça après bouffer ;)
 
merci encore  :)


---------------
Force m'est de constater qu'il m'est de plus en plus difficile de faire coïncider mes levers tardifs et mes couchers anticipés par le biais de siestes prolongées... :D
Reply

Marsh Posté le 03-05-2001 à 12:25:52    

Dans un topic d'il y a quelques jours, il y avait une requête où, à la place d'une liste de tables dans le FROM, tu avais une sous-requête.
 
Si, dans la sous-requête, tu te débrouilles pour caser l'expression en CASE, tu pourras faire ton datediff() comme chez Tata dans le SELECT...
 
thegti pourrait sûrement mieux te parler de ça que moi.
 
Sinon pareil, je verrai ça après la bouffe.

Reply

Marsh Posté le 03-05-2001 à 15:21:26    

Fred999 a écrit a écrit :

Dans un topic d'il y a quelques jours, il y avait une requête où, à la place d'une liste de tables dans le FROM, tu avais une sous-requête.
 
Si, dans la sous-requête, tu te débrouilles pour caser l'expression en CASE, tu pourras faire ton datediff() comme chez Tata dans le SELECT...
 
thegti pourrait sûrement mieux te parler de ça que moi.
 
Sinon pareil, je verrai ça après la bouffe.




le case est bien dans une sous requete et c'est ça qui marche pas
a cause de sqlglandeur qui veut pas de avg et datediff sur une sous requete :sweat:

 

[edit]--Message édité par ajnag--[/edit]


---------------
Chasser sans bière c'est comme... pêcher sans bière.
Reply

Marsh Posté le 03-05-2001 à 15:53:55    

Justement, remettre le case dans le FROM permettrait de faire simplement un AVG(datediff()) dans le SELECT, ce que Sybase 12 (le jumeau de SQL server) accepte parfaitement.
Et donc, un truc du genre :;
 

Code :
  1. SELECT AVG(DATEDIFF(dd, madate, work_started_date))
  2. FROM
  3.        SELECT "madate" = CASE
  4.                  when el_information_date <= sample_rec_date then sample_rec_date 
  5.                  when el_information_date > ample_rec_date then el_information_date 
  6.                  END ,
  7.               work_started_date
  8.   FROM   SSR
  9.   WHERE
  10.         sample_rec_date IS NOT NULL
  11.   AND 
  12.         work_started_date IS NOT NULL
  13.   AND
  14.         el_information_date IS NOT NULL


 
Et j'aimerais bien que thegti confirme!!!

 

[edit]--Message édité par Fred999--[/edit]

Reply

Marsh Posté le 03-05-2001 à 15:53:55   

Reply

Marsh Posté le 03-05-2001 à 17:44:03    

thegti, il était bien occupé aujourd'hui :(
thegti, il dit qu'il comprends bien SQL Server qui veut pas appliquer la fonction datediff sur une sous-requête non unitaire
thegti, il dit aussi que la solution de fred999 lui parait très correct
Néanmoins, thegti tient a signalé qu'il peut y avoir des problèmes si on met pas de parenthèses et si on "alias" pas la sous requête
Ici ca donne:
SELECT AVG(DATEDIFF(dd, TMP.madate, TMP.work_started_date))  
FROM  
      ( SELECT "madate" = CASE  
                 when el_information_date <= sample_rec_date then sample_rec_date    
                 when el_information_date > ample_rec_date then el_information_date    
                 END ,  
              work_started_date  
  FROM   SSR  
  WHERE  
        sample_rec_date IS NOT NULL  
  AND    
        work_started_date IS NOT NULL  
  AND  
        el_information_date IS NOT NULL ) TMP
 
 
PS: j'ai bien imité Alain Delon non ? :D

Reply

Marsh Posté le 03-05-2001 à 18:14:50    

Haaaa merci de corriger ma syntaxe, je n'ai jamais employé cette méthode au boulot. Niveau perfs, ça donne quoi?
 
PS : ton imitation, ça sonnait nettement plus Johnny dans les Guignols...  :crazy:

 

[edit]--Message édité par Fred999--[/edit]

Reply

Marsh Posté le 03-05-2001 à 18:24:51    

Aque coucou .... ah ah ah ah
 
Niveau perfs, c'est pareil que sans sous-requête, ca suit le même plan d'éxecution
 
PS: me dis pas que mon imitation de johnny ressemble plus à Alain Delon ! :D

Reply

Marsh Posté le 04-05-2001 à 10:34:23    

merci les gars ça marche nickel


---------------
Chasser sans bière c'est comme... pêcher sans bière.
Reply

Marsh Posté le 11-05-2001 à 11:58:36    

marche pas en asp mais nickel sur sqlserveur
je comprends pas :??:
 
SELECT AVG(DATEDIFF(dd,work_started_date,madate)) FROM (SELECT madate = CASE WHEN el_information_date <= sample_rec_date THEN sample_rec_date ELSE el_information_date END, work_started_date FROM SSR WHERE ((sample_rec_date IS NOT NULL) AND (work_started_date IS NOT NULL) AND (el_information_date IS NOT NULL) AND (deletion_date IS NULL))) as TMP  
ADODB.Fields error '800a0cc1'  
 
ADO could not find the object in the collection corresponding to the name or ordinal reference requested by the application

Reply

Marsh Posté le 11-05-2001 à 14:35:27    

up :sweat:

Reply

Marsh Posté le 11-05-2001 à 14:36:23    

Up  :sweat:  :sweat:

Reply

Marsh Posté le 11-05-2001 à 15:25:20    

Tu peux nous remettre la requête sous forme lisible STP?
 
Et ce message d'erreur signifie quoi?
 
(désolé, je connais uniquement les messages d'erreur Sybase)

Reply

Marsh Posté le 11-05-2001 à 15:55:54    

SELECT AVG(DATEDIFF(dd,work_started_date,madate))  
FROM (
   SELECT madate = CASE WHEN el_information_date <= sample_rec_date THEN sample_rec_date  
                  ELSE el_information_date  
                   END
         ,work_started_date  
   FROM SSR  
   WHERE ((sample_rec_date IS NOT NULL)
   AND (work_started_date IS NOT NULL)  
   AND (el_information_date IS NOT NULL)  
   AND (deletion_date IS NULL)))  
as TMP  
 
 
ADODB.Fields error '800a0cc1'  
 
ADO could not find the object in the collection corresponding to the name or ordinal reference requested by the application

 

[edit]--Message édité par ajnag--[/edit]

Reply

Marsh Posté le 11-05-2001 à 16:02:48    

Si la requete marche nickel sous sqlserver, a mon avis...
penche toi sur le code asp...
Remplace la par une requete simple (du genre ki retourne un nombre ou une date suivant ce que tu veux)
et tu verra bien si ta tjrs l'erreur...
Le principal c que tu sois sur que ta requete marche dans une page asp simple ...

 

[edit]--Message édité par wouatouwouatou--[/edit]

Reply

Marsh Posté le 11-05-2001 à 16:10:26    

Franchement, je ne vois pas d'où l'erreur peut venir. Désolé :(

Reply

Marsh Posté le 11-05-2001 à 16:13:32    

wouatouwouatou a écrit a écrit :

Si la requete marche nickel sous sqlserver, a mon avis...
penche toi sur le code asp...
Remplace la par une rquete simple (du genre ki retourne une date)
et tu verra bien si ta tjrs l'erreur...




 
merci c toujours les erreurs de merde qu'on ne voit pas
 
:lol:
 
je suis une merde :D

Reply

Marsh Posté le 11-05-2001 à 17:08:41    

Sinon...
 
select min(date_temp) date_la_plus_petite from (
   select date1 as date_temp from table1
   where ...
   union
   select date2 as date_temp from table1
   where ...
) fausse_table;

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed