Pas de problème (pb), que du PowerBuilder (PB) ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 06-06-2007 13:03:06

digital prophecy  
Membre Geek
Date d'inscription: 29-05-2006
Messages: 55
Pépites: 310
Banque: 0

Différence entre deux dates

Existe-il une fonction dans les datawindow expressions pour donner la différence entre deux dates ?
En fait, j'ai l'intention d'affichier dans un computed phield la différense en minutes entre deux dates. Je peux le faire en récupérant chaque partie de la date (An,Mois,Jous,H,M) et donner la différence, mais je suppose qu'il y existe déjà une fonction qui fait le boulot. quelqu'un peut-il m'aider ?
Merci bcp !

Hors ligne

 

#2 06-06-2007 13:40:09

pick ouic  
La bourse ou la vie ^^
Award: gearotter
Lieu: Massy-Verrières
Date d'inscription: 29-05-2006
Messages: 4658
Pépites: 942
Banque: 2,147,483,647
Site web

Re: Différence entre deux dates

salut, j'ai juste cette fonction globale... qui permet de calculer le nombre de secondes entre 2 dates...
apres, tu pourras toujours convertir les secondes en minutes...

il faudra importer cette fonction (issue des pfcs).

A noter que tu pourras appeler une fonction globale dans une datawindow expression.

Code: pb

$PBExportHeader$of_secondafter.srf
global type of_secondafter from function_object
end type

forward prototypes
global function long of_secondafter (datetime adtm_start, datetime adtm_end)
end prototypes

global function long of_secondafter (datetime adtm_start, datetime adtm_end);//////////////////////////////////////////////////////////////////////////////
//
//  Function:      of_SecondsAfter
//
//  Access:      public
//
//  Arguments:
//  adtm_start     Beginning time.
//  adtm_end       Ending time.
//
//  Returns:      long
//            Number of whole seconds between two date times.
//            If any argument's value is NULL, function returns NULL.
//            If any argument's value is Invalid, function returns NULL.
//
//  Description:    Given two datetimes, return the number of seconds between 
//            the two.
//
//////////////////////////////////////////////////////////////////////////////
//
//  Revision History
//
//  Version
//  5.0   Initial version
//
//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1996-1997 Sybase, Inc. and its subsidiaries.  All rights reserved.
//  Any distribution of the PowerBuilder Foundation Classes (PFC)
//  source code by other than Sybase, Inc. and its subsidiaries is prohibited.
//
//////////////////////////////////////////////////////////////////////////////

long ll_total_seconds, ll_day_adjust
date ld_sdate, ld_edate
time lt_stime, lt_etime



ld_sdate = date(adtm_start)
ld_edate = date(adtm_end)

lt_stime = time(adtm_start)
lt_etime = time(adtm_end)

//Note: 86400 is number of seconds in a day.
If ld_sdate = ld_edate then 
  ll_total_seconds = secondsafter(  lt_stime,lt_etime)
Elseif ld_sdate < ld_edate Then
  ll_total_seconds = SecondsAfter(lt_stime,Time('23:59:59'))
  ll_day_adjust = DaysAfter(ld_sdate,ld_edate) -1
  If ll_day_adjust > 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust
  ll_total_seconds = ll_total_seconds + SecondsAfter(Time('00:00:00'),lt_etime) +1
Else //end date < start date
  ll_total_seconds = SecondsAfter(lt_stime,Time('00:00:00'))
  ll_day_adjust = DaysAfter(ld_sdate,ld_edate) +1
  If ll_day_adjust < 0 Then ll_total_seconds = ll_total_seconds + 86400 * ll_day_adjust
  ll_total_seconds = ll_total_seconds + SecondsAfter(Time('23:59:59'),lt_etime) -1
end If

return ll_total_seconds

end function



Connaitre son ignorance est une grande part de la connaissance.
http://animegifs.free.fr/anime/mazinger/mazinger.gif

Hors ligne

 

#3 06-06-2007 19:18:42

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,776,000
Site web

Re: Différence entre deux dates

Salut,

Il existe la fonction DaysAfter(date1, date2) et qui te retourne le nombre de jours entre les 2 dates...
Par contre si tu veux les heures et minutes alors il faut également utiliser SecondsAfter(time1, time2) et convertir en heures, minutes... Bien sur tu utilises le SecondsAfter sur la partie Time de ta date....

Code: PB

/*
Fonction avec 2 params datetime : adt_date1 et adt_date2
Si la date 2 est inférieure à date 1 alors ll_jours est négatif
*/

long ll_jours, ll_heure, ll_minute, ll_second

ll_second = SecondsAfter(Time(adt_date1), Time(adt_date2))

ll_jours = DaysAfter(date(adt_date1), date(adt_date2))
ll_heure = Long(ll_second / 3600)
ll_minute = Long(ll_second - (ll_heure * 3600)) / 60
ll_second = ll_second - ((ll_heure * 3600) + (ll_minute * 60))


Chrnico

Dernière modification par Chrnico (06-06-2007 19:39:50)


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#4 06-06-2007 19:30:18

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Différence entre deux dates

Bonsoir, sinon il reste toujours la possibilité de déléguer au SGBDR.

Exemple sous Oracle, avec une fonction trouvée ici :

Code: sql

create or replace function datediff( p_what in varchar2,
                                     p_d1   in date,
                                     p_d2   in date ) return number
  as
      l_result    number;
  begin
      select (p_d2-p_d1) *
             decode( upper(p_what),
                     'SS', 24*60*60, 'MI', 24*60, 'HH', 24, NULL )
       into l_result from dual;

      return l_result;
  end;


utilisation dans PB:

Code: pb

global function decimal gf_datediff(string as_what, datetime adt_d1, datetime adt_d2 );
Decimal lc_datediff

SELECT datediff( :as_what, :adt_d1, :adt_d1)
INTO :lc_datediff
FROM DUAL ;

Return lc_datediff

end function

N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#5 06-06-2007 19:45:28

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,776,000
Site web

Re: Différence entre deux dates

Salut eRasorZ,

C'est vrai qu'on ne délègue jamais assez à Oracle
Attention à l'ordre des arguments dans ton appel à la fonction c'est perturbant


Chrnico

Dernière modification par Chrnico (06-06-2007 19:50:05)


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#6 06-06-2007 19:52:10

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Différence entre deux dates

Chrnico a écrit:

Attention à l'ordre des arguments dans ton appel à la fonction

c'était pour voir qui suivait , c'est rectifié, bien joué 00 pépites à ton compteur !

Chrnico a écrit:

Et pour avoir le résultat, il faut faire 3 accès base avec à chaque fois le as_what correspondant (HH, MI, SS)

c'était un exemple,
libre à toi ensuite d'écrire une fonction dérivée avec le format qui t'arranges (cf exemple)


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#7 06-06-2007 19:55:47

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,776,000
Site web

Re: Différence entre deux dates

Tu as raison. J'avais d'ailleurs viré ma phrase avant ta réponse. Désolé


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22