Newsgroup: it.comp.lang.visual-basic
Titolo: DateDiff

Scusate ma datediff lavora con le stringhe?
se io scrivo
dim datascelta as date
dim data as data
data= datediff(date,datascelta)
mi dice argomento non facoltativo
Debby ----)@


date e datascelta devono essere variabili di tipo Variant (Date) e quindi è
giusta la dichiarazione che hai fatto.
Quello che manca è il primo parametro *Interval* che indica l'intervallo di
tempo usato per calcolare la differenza tra le due date (secondi, minuti,
ore, giorni, settimane, ecc..).
La sintassi completa è:
DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
-- 
Esteban
www.seber.it
Questo post è stato scritto con bit riciclati.

 significato!
uhmm...
deborah...
quando tu, all'interno dell'ide di visual basic, e con il caret su una
parola chiave, schiacci il pulsante "F1" (quello sulla riga di tasti più in
alto), che cosa succede?
si, lo so, è una domanda perfida.
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo


Lascia perdere DateDiff, crea solo un overhead al tuo codice.
DataScelta - Data = numero di giorni di differenza
Ciao


Beh, sono cose diverse. Dipende da ciò che uno vuole:
Private Sub Command1_Click()
Dim Data1 As Date
Dim Data2 As Date
Data1 = #10/3/2004 1:01:00 PM#
Data2 = #11/3/2004 1:01:00 AM#
Debug.Print CStr(Data2 - Data1)
Debug.Print CStr(CLng(Data2 - Data1))
Debug.Print CStr(DateDiff("d", Data1, Data2))
End Sub
Ciao
Alberto

 Debug.Print CStr(DateDiff("d", Data1, Data2))
Queste due invece dovrebbero coincidere.
Ciao

 Queste due invece dovrebbero coincidere.
E' proprio perchč non coincidono che ti facevo notare la differenza.
ciao
Alberto

 E' proprio perchè non coincidono che ti facevo notare la differenza.
Ah, certo.
Ma che vuol c'entra?
La differenza è la medesima.
Quella "pura" ti da anche la possibilità di decidere cosa fare delle 
frazioni di giorno.
Ciao


Aspetta.
Se tu hai due variabili Date la cui differenza è 25 ore (ossia 1.0416666
double), la differenza 'in giorni' quant'è?
Se operi sulla differenza delle date come double, a priori non sai la
differenza di data. Al limite, fai un CLng di 1.0416666 e ottieni 1.
Ma se le due date erano:
 #3/10/2004 12:01:00 AM#
 #3/12/2004 12:02:00 AM#
la differenza di data è 2, non 1.
Sostanzialmente, se vuoi utilizzare il semplice operatore -, per avere la
differenza in giorni devi ragionare anche sul valore assoluto degli orari, e
sinceramente mi sembra un complicarsi la vita inutilmente.
Posto il codice che ho usato per le prove:
Dim Data1 As Date
Dim Data2 As Date
Dim Data3 As Date
Data1 = #3/10/2004 11:59:00 PM#
Data2 = #3/11/2004 12:01:00 AM#
Data3 = #3/12/2004 12:02:00 AM#
Debug.Print CStr(Data3 - Data1)
Debug.Print CStr(CLng(Data3 - Data1))
Debug.Print CStr(DateDiff("d", Data1, Data3))
Debug.Print CStr(Data3 - Data2)
Debug.Print CStr(CLng(Data3 - Data2))
Debug.Print CStr(DateDiff("d", Data2, Data3))
come vedi, la differenza espressa in double fra D1 e D3, e fra D2 e D3, è
pressochè identica (cambia di qualche millesimo di giorno), ma espresso in
giorni in un caso ti risulta 1 e in un caso ti risulta 2. Come avresti
potuto gestire questo operando sugli arrotondamenti della differenza dei due
double?
Ciao
Alberto

 sinceramente mi sembra un complicarsi la vita inutilmente.
Dipendeeee :)
A me piace sempre avere il pieno controllo di ciò che succede.
Se mi fossi basato su DateDiff, chi legge il mio codice dovrebbe sapere 
che DateDiff arrotonda sempre per eccesso (è sempre così, vero? o anche 
lui fa gli arrotondamenti bancari?), invecie trattando le date come 
Double posso esplicitamente fare
difetto = CLng(data_diff)
oppure
if (data_diff - CLng(data_diff)) > 0 then
	data_diff = CLng(data_diff) + 1
end if
Ciao

 lui fa gli arrotondamenti bancari?)
Forse ho colto dov'è il punto su cui non ci capiamo.
Tu dici che DateDiff arrotonda per eccesso.
Ma non è così. Può benissimo arrotondare per difetto. Dipende, come ti
dicevo, dagli orari del giorno.
In realtà non è una semplice differenza di come fare l'arrotondamento, ma di
*quando* fare l'arrotondamento.
Se tu usi le date come double, ne fai la differenza, poi hai un valore
double, che ti indica quanti giorni (anche parziali), ci sono.
Se usi il datediff, con parametro D (Day), vb PRIMA arrotonda le date
all'ora 00:00:00, e poi fa la differenza, che a questo punto è sempre un
long.
In sostanza, usare la differenza 'schietta' e poi fare un CLng ti espone a
risultati diversi in funzione degli orari del giorno, mentre usare il
datediff ti consente di utilizzare le date come data pura, senza orario.
E' evidente, e su questo siamo in accordo, che a seconda delle applicazioni
puoi usare una o l'altra, ma quello che volevo precisare è che la tua
affermazione: "Lascia perdere DateDiff, crea solo un overhead al tuo codice.
DataScelta - Data = numero di giorni di differenza" non è del tutto
corretta. Scritta così, sembra che una o l'altra diano lo stesso risultato,
mentre danno risultati diversi, concettualmente.
Ciao
Alberto

> alto), che cosa succede?
Sergio purtroppo il mio gatto mi ha distrutto i dischi che sono in mio
possesso... quindi lavoro senza msdn ecco perchè alle volte faccio domande
stupide... non sempre trovo le cose "semplici" nei libri in mio possesso
Debby
PS
Tempo fa lo avevo anche accennato a Lupo mi sembra

Ho creato un thread interessante vedo eh!
Comunque ( con i dovuti ringraziamenti a priori) la mia domanda era dovuta
nel sapere
gli anni di anzianità di un dipendente e questa, come normalmente succede va
in Anni.
Sto riscontrando comunque ulteriori problemi che, con un pò di impegno,
sorpasserò
anche se con un pò di affanno, nel lavorare con le date.
La mia domanda era scaturita da alcuni dubbi, infatti non sapevo se
dichiarare le variabili
come Date oppure come Stringhe e poi fare la conversione.
Deduco alla fine che è giusto dichiararle come Date giusto?
Quindi se l'assunzione è il 01/01/2004 in data 31/12/2004 l'anzianità deve
risultare 0 mentre
deve risultare 1 quando la data del controllo è all 01/01/2005.
Seguendo il consiglio di Albe e di Zanna scrivo cosi la mia Sub
Dim DataAssunzione As Date
Dim DataCheck As Date   <.----Data del controllo
Dim AnzianitàDipendente As Integer
Dim MeseCheck  As Integer
Dim AnnoCheck As Integer
MeseCheck  = CInt(frmCheck.cboMese.ListIndex)
AnnoCheck  = CInt(frmCheck.txtAnno.Text)
DataAssunzione = CDate(frmProfilo.txtAssunzione.Text)
DataCheck = CDate("1" & "/" & MeseCheck & "/" & AnnoCheck)
AnzianitàDipendente = Format ( (DataCheck -DataAssunzione ) , "yy" )
Dovrebbe andar bene no?
Debby

Uff mi sembrava troppo semplice!
Perche se:
DataAssunzione = #01/02/1997#
DataCheck = #01/01/2004#
AnzianitàDipendente = CInt(DateDiff("yyyy", Data.Assunzione, DataCheck))
AnzianitàDipendente mi viene uguale a 7 mentre io voglio che venga 6 perchè
il settimo
anno scatta il primo di febbraio...
Debby

 Dovrebbe andar bene no?
Per niente :)
Se tenti conversioni stringhe <--> date incorrerai prima o poi in grossi
problemi proprio perchè VB "interpreta" le stringhe contenenti date.
Per ottenere una data dati i suoi componenti usa:
MyData = DateSerial(anno, mese, giorno)
Per sapere quanti anni sono trascorsi tra due date:
AnniTrascorsi = Year(DataRecente) - Year(DataVecchia)
Anche qui, se ti interessa conteggiare solo gli anni *interamente*
trascorsi:
AnniTrascorsi = Year(DataRecente) - Year(DataVecchia) - 1
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 AnniTrascorsi = Year(DataRecente) - Year(DataVecchia) - 1
Perchè quel -1?
Debby   -----)(@

 Perchè quel -1?
Perchè è un errore :P
Vediamo se riesco a correggerlo nonostante il sonno:
AnniTrascorsi = Year(DataRecente) - Year(DataVecchia)
If (DateValue(1, Month(DataRecente), Day(DataRecente)) < _
    DateValue(1, Month(DataVecchia), Day(DataVecchia))) Then
    AnniTrascorsi = AnniTrascorsi - 1
End If
Perchè come dicevi nell'altro post, se le date sono:
31/12/2000 e 1/1/2001 la differenza tra gli anni sarebbe, quando invecie è
di un solo giorno.


 End If
Non mi da errore appena si avvia l'applicazione. Forse si devono
inizializzare
le date?
DataRecente praticamente è la data del sistema operativo (date) ma anche
inizializzando le date l'errore rimane e mi dice.
Numero errato di argomenti o assegnazione di proprietà non valida
evidenziandomi DataValue.
Questi comandi io non li ho mai usati e non so dove mettere le mani!
Debby!! -----)@

 Questi comandi io non li ho mai usati e non so dove mettere le mani!
Questo è facile: sulla tastiera, in particolare sul tasto F1 :)


> Perchè sono un rimbecillito in questi giorni :P
No Zanna non sei rimbecillito anzi mi hai fatto imparare un'altra cosa. Mi
sono andata a cercare DataValue e alla fine ho letto cose nuove
VB fornisce il comando DataValue(stringa) che restituisce un espressione di
tipo data che rappresenta la data contenua tra parentesi
es
Dim PreMillenium as Date
PreMillenium = DataValue("31/12/1999")
Cmq proverò con DataSerial
Grazie Zannetta!
Debby ----)@

 ha scritto nel messaggio
news:WyE4c.48293$O31.2...@news4.tin.it...


 ha scritto nel messaggio
news:bwq4c.37884$z23.1...@news3.tin.it...
