Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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
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.
$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
Hors ligne
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....
/* 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)
Hors ligne
Bonsoir, sinon il reste toujours la possibilité de déléguer au SGBDR.
Exemple sous Oracle, avec une fonction trouvée ici :
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:
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
Hors ligne
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)
Hors ligne
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)
Hors ligne
Tu as raison. J'avais d'ailleurs viré ma phrase avant ta réponse. Désolé
Hors ligne