View Full Version : [VB6] calcolare differenza tra date
RaouL_BennetH
06-03-2005, 13:02
Buona domenica a tutti.
Non riesco in visual basic ad effettuare un calcolo tra date;
es:
input al 03/03/2005 alle 15:00:39
output al 06/03/2005 alle 20:31:46
non riesco a capire come fargli fare il totale delle ore e dei giorni.
Mi aiutate?
Thx.
RaouL.
motogpdesmo16
06-03-2005, 19:20
io so che il visual basic ha una funzione predefinita che calcola la distanza in giorni dalla data odierna. Si chiama DateDiff. C'è una peculiarità: nel caso la data inserita in input è anteriore alla data odierna, il numero di giorni risulta essere negativo.
questo è il codice comunque (che puoi anche trovare nell'help in linea)
Private Sub Form_Load()
Dim TheDate as Date
Dim Msg
TheDate=InputBox("Digitare una data")
Msg="Giorni dalla data odierna: " & DateDiff("d", Now, TheDate)
MsgBox Msg
End Sub
RaouL_BennetH
06-03-2005, 22:35
scusa, colpa mia che mi sono espresso una schifezza..
allora, in un database, ho un campo "Orario", che memorizza un "Now"....
es.:
06/03/2005 23.14.05
quindi, mi prende la data precisa completa di ora, minuti e secondi.
Bene, quello che avrei necessità di fare, è che anzichè prendermi l'orario in questa maniera, me lo divida in:
data
ora
in modo da avere nel database:
data
06/03/2005
ora
23.14.05
e fin qui, credo che devo solo capire come "scomporre" il comando Now per farmi questa divisione.
ora, succede che devo fare il calcolo del tempo in base alle ore, e non alla data, ovvero:
ora1
23.00.00
ora2
24.00.00
totale ore
1.00
ho provato con:
DateDiff("h", Ora1, Ora2)
ma senza successo :(
Allura, per fare quello che vuoi tu fai così:
MsgBox Format(Now, "dd/mm/yyyy")
MsgBox Format(Now, "hh.ss")
naturalmente metti in Now la data presa dal database.
Per fare i calcoli, è giusto come fai tu, ma le 24 nn sono un ora, perchè in tutto il mondo sono le 0 !!
Quandi mi sa che devi rivedere un po' la faccenda.
RaouL_BennetH
06-03-2005, 23:20
Originariamente inviato da matpez
Allura, per fare quello che vuoi tu fai così:
MsgBox Format(Now, "dd/mm/yyyy")
MsgBox Format(Now, "hh.ss")
naturalmente metti in Now la data presa dal database.
Per fare i calcoli, è giusto come fai tu, ma le 24 nn sono un ora, perchè in tutto il mondo sono le 0 !!
Quandi mi sa che devi rivedere un po' la faccenda.
mmm.... forse il problema è un pò più complicato, e mi scuso ancora se l'ho spiegato una schifezza :(
allora, la tabella del db ha questi campi:
Nome
data
orario
bene, la divisione di "Now" l'ho semplicemente effettuata così:
in "Date" e in "Time", in modo che nei due campi del db
ottengo:
RaouL
07/03/2005
13.10.25
E fin qui va tutto bene ma....quello che in realtà devo calcolare, è il tempo che "Raoul" ha trascorso tra quando ha inserito per la prima volta il suo nome per iniziare la sessione, e quando lo ha ri-digitato per terminare.
Quindi, nel DB io avrò ad esempio:
RaouL 07/03/2005 13.10.25
RaouL 07/03/2005 18.10.25
Bene, come faccio ad ottenere le 5 ore?
:cry:
Io ho provato, ma se faccio così...
MsgBox DateDiff("h", CDate("07/03/2005 13.10.25"), CDate("07/03/2005 18.10.25"))
...funziona e ti tornano le tue 5 ore :)
RaouL_BennetH
07-03-2005, 14:29
Originariamente inviato da matpez
Io ho provato, ma se faccio così...
MsgBox DateDiff("h", CDate("07/03/2005 13.10.25"), CDate("07/03/2005 18.10.25"))
...funziona e ti tornano le tue 5 ore :)
Ma mi funziona se ad esempio io prendo l'intervallo da due textbox, o due variabili, ma non mi riesce di farlo funzionare visto che la Data1 e la Data2, sono un recordset;
es.:
MsgBox DateDiff("h", rs("Orario"), rs("Orario"))
In questo modo non mi funziona purtroppo :(
MsgBox DateDiff("h", CData(rs("Orario")), CDate(rs("Orario")))
Originariamente inviato da cionci
MsgBox DateDiff("h", CData(rs("Orario")), CDate(rs("Orario")))
Eggià cionci, RaouL_BennetH nn guarda fino in fondo gli esempi, già nel mio era così, heehheeh, sei un pochino sbadatello :p
RaouL_BennetH
07-03-2005, 19:36
Originariamente inviato da matpez
Eggià cionci, RaouL_BennetH nn guarda fino in fondo gli esempi, già nel mio era così, heehheeh, sei un pochino sbadatello :p
Chiedo perdono ad entrambi :ave:
really sorry :D
Grazie millissime cmq :)
torno fra poco per bombardarvi di nuovo :p
RaouL_BennetH
07-03-2005, 20:01
Però...... no, evidentemente non ci arrivo:
Come differenza mi da sempre 0.
ecco il codice:
MsgBox DateDiff("h", CDate(rs("orario")), CDate(rs("orario")))
Nel campo del db orario ho questi due orari:
22.14.58
23.21.12
Ho provato a metterli anche senza secondi, ma qualsiasi orario abbia, mi restituisce sempre 0. :(
Bhe ma è logico... pensaci, stai dando alla differenza la stesso valore, nn ti sembra veramente una caxxata?
Per fare quello che vuoi tu, ti devi memorizzare in una variabile Date il primo valore e poi il secondo!
dtData1=rs("orario"))
rs.movenext
dtData2=rs("orario"))
MsgBox DateDiff("h", dtData1, dtData2)
RaouL_BennetH
19-03-2005, 16:08
Tornando su questo codice che poi grazie al VS aiuto sono riuscito a far funzionare, ora volevo lavorare un pò di fino e fare in modo che non mi 'arrotondasse' il risultato.
Ad es.: se la differenza fra le ore è di 5.37
vorrei averlo con una certa precisione perchè riesco solo ad ottenere un arrotondamento a 5 ore.
Suggerimenti?
Thx.
RaouL.
DateDiff("h", dtData1, dtData2)
Perchè così gli chiedi di calcolarlo in ore...
Calcolalo in secondi e poi fai una divisione intera per 60 per ottenere i minuti e una divisone intera per 3600 per ottenre le ore...
Ciao ;)
RaouL_BennetH
19-03-2005, 16:33
Originariamente inviato da cionci
DateDiff("h", dtData1, dtData2)
Perchè così gli chiedi di calcolarlo in ore...
Calcolalo in secondi e poi fai una divisione intera per 60 per ottenere i minuti e una divisone intera per 3600 per ottenre le ore...
Ciao ;)
Ci avevo pensato sinceramente, ma, credevo di star facendo un ragionamento troppo complicato, e stavo cercando su msdn qualcosa tipo: ("h:m"......)
non avendola trovata sono arrivato qui:
http://msdn.microsoft.com/library/ita/default.asp?url=/library/ITA/vblr7/html/vaoriFunctionsDtoGVBA.asp
dove infatti non c'è una funzione apposita che restituisca direttamente un dato più preciso, cioè, come serve a me.
Thx a lot :)
RaouL_BennetH
19-03-2005, 17:02
qualcosa non torna:
allora, nel db il campo "sessione" è in formato testo
in questo campo ci va il dato in questa forma:
19/03/2005 18.00.40 (per esempio)
ora, ho seguito il suggerimento di Matpez che mi diceva di crearmi una variabile per contenere questo campo sul quale calcolare la differenza:
Dim Sessione1 As String
Dim Sessione2 As String
' apro la connessione al db.....
Sessione1 = rs("sessione")
rs.movenext
Sessione2 = rs("sessione")
'dichiaro poi una variabile per la differenza ore:
Dim TotOre As Double
TotOre = DateDiff("s", Sessione1, Sessione2) / 3600
Ho provato come intervalli:
19/03/2005 07.30.00
19/03/2005 15.45.00
e dovrebbe quindi restituirmi 8.15 ore....
invece... me ne da 8.25
:confused:
Te l'ho detto devi fare una divisone intera... Per ottenere i minuti o prendi il resto della divisione per 60...
Dim Ore As Integer, Minuti As Integer
Ore = Secondi / 3600
Minuti = (Secondi Mod 3600) / 60
RaouL_BennetH
19-03-2005, 18:16
Originariamente inviato da cionci
Te l'ho detto devi fare una divisone intera... Per ottenere i minuti o prendi il resto della divisione per 60...
Dim Ore As Integer, Minuti As Integer
Ore = Secondi / 3600
Minuti = (Secondi Mod 3600) / 60
ma difatti è così :(
l'unica cosa che non ho capito come fare, è come prendermi il resto che mi viene tramite mod e sommarlo all'ora totale :(
RaouL_BennetH
19-03-2005, 18:25
ho fatto così ma mi pare troppo complesso:
wd = DateDiff("s", dtDate, dtDate1) / 60 ' ottengo i minuti
wl = (wd / 60) ' ottengo le ore
wm = wd Mod 60 ' ottengo il resto che sono i miei minuti
wt = wl & "." & wm ' questo è il totale
Va bene così...nonc apisco cosa tu voglia ottenere... Ad esempio se hai 3 ore e 30 minuti vuoi ottenere 3,5 ?
In tal caso fai:
Dim res As Double
...
...
...
res = Ore + (Minuti / 60) * 100
RaouL_BennetH
20-03-2005, 12:23
Originariamente inviato da cionci
Va bene così...non capisco cosa tu voglia ottenere... Ad esempio se hai 3 ore e 30 minuti vuoi ottenere 3,5 ?
In tal caso fai:
Dim res As Double
...
...
...
res = Ore + (Minuti / 60) * 100
Grazie Cionci, era proprio quello che dovevo ottenere come formato. Ci ero arrivato stamattina presto, ma ancora non avevo postato perchè cercavo un mezzo ove possibile ancora più semplice. Grazie Millissime :)
RaouL.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.