Newsgroup: it.comp.appl.access
Titolo: Somma ore a cavallo tra due giorni

Buongiorno a tutti,
Ho due campi di tipo data/ora (oraDalle e oraAlle), formattati come "Ora Breve 24h".
 
Per trovare il numero di ore trascorse faccio come segue:
Dim dateDalle As Date
Dim dateAlle As Date
Dim dateTot As Date
 
dateDalle = Me.oraDalle
dateAlle = Me.oraAlle
dateTot = dateAlle - dateDalle
 
La cosa funziona correttamente, se le oraDalle < oraAlle (ossia quando l'intervallo di tempo considerato è nello stesso giorno).
 
Quando però ho, ad es:
oraDalle: 18:00
oraAlle: 02:00
mi aspetterei 8:00 dalla formula di cui sopra, che però mi restituisce un risultato "sbagliato", pari a 16:00:00.
 
Potreste aiutarmi a capire cosa sto sbagliando?
Come posso risolvere?
 
Grazie!

La data è un numero intero.
L'ora è la parte decimale.
1 minuto è 1/24/60


Microsoft Access (ma non solo lui) memorizza la data/ora con un numero
la cui parte intera rappresenta i giorni a partire dal 30/12/1899 e la
parte decimale la frazione di giorno (in pratica le ore 12 del
31/12/1899 vengono memorizzate 1,5).
 
Quando hai inserito i tuoi orari con il formato "Ora breve 24" il
programma ho memorizzato rispettivamente le ore 18 del 30/12/1899 e le
ore 08 del 30/12/1899. Poi hai fatto la sottrazione e sei capitato -
tra l'altro - nel magico mondo delle date minori di 0 e maggiori di -1
(le cui implicazioni ti risparmio).
 
E poi, se non glielo dici, come fa il povero Access a sapere che le
02.00 sono del primo giorno successivo a quello in cui alle 18.00 è
iniziato il turno? :-;
 
Secondo me devi prima di tutto affinare i tuoi input. Poi provare a
studiare la formattazione delle date e la funzione DateAdd.
 
Ciao, buon lavoro!
Alberto S


Grazie per l'indicazione Roberto,
Premesso che nei campi data/ora digito solo l'orario (quindi la parte decimale), credo/spero d'aver risolto come segue:
 
Dim dateDalle As Date
Dim dateAlle As Date
Dim dateTot As Date
 
dateDalle = Me.oraDalle
dateAlle = Me.oraAlle
 
'stesso giorno
If dateDalle < dateAlle Then
        dateTot = dateAlle - dateDalle
'orari a cavallo tra due giorni
Else
        dateTot = dateAlle + (24 - dateDalle)
End if
 
Facendo qualche test sembra comportarsi bene..
Grazie!


Ciao Alberto,
Con le tue spiegazioni inizio a capire meglio la cosa ora, ed è più complessa di quello che immaginavo.
La struttura della mia tabella ha 4 campi data/ora: dataTurno, oraDalle, oraAlle, e totOre.
 
La mia idea iniziale era di impiegare il primo per accoglie la data del turno, e gli altri per salvare l'ora di inizio e fine turno e il conteggio delle ora tra inizio e fine turno (per le mie esigenze questa idea andava bene).
 
Stando a quanto ho capito, però, nei campi data/orario Access salva data + ora, nel formato "gg/mm/aa hh:mm:ss".
 
Ho corretto il mio codice come segue:
 
    Dim dateDalle As Date
    Dim dateAlle As Date
    Dim dateTot As Date
 
    dateDalle = Me.oraDalle
    dateAlle = Me.oraAlle
 
    'stesso giorno
    If dateDalle < dateAlle Then        
        dateTot = dateAlle - dateDalle
        Me.totOre = dateTot        
    'a cavallo di due giorni
    Else        
        dateTot = dateAlle + (24 - dateDalle)
        Me.totOre = Format(dateTot, "hh:mm")
    End If
 
Credo che il formattare l'output con "hh:mm" mi permetta di salvare nel campo totOre la sola parte decimale del dato, ossia l'ora.
Infatti quando apro la tabella e clicco su una cella totOre, il dato rimane uguale ("hh:mm") e non cambia più in "gg/mm/aaaa hh:mm:ss"
 
Gli utenti vogliono poi esportare Il tutto in excel, e anche li le colonne oraDalle, oraAlle, e totOre si comportano come la tipologia "Ora Breve".
 
E corretto?
Grazie

On Sun, 9 Aug 2020 04:59:50 -0700 (PDT), eman

Alcuni spunti:
 
La gestione delle presenze è un po' complessa. Chiaramente se il db lo
usi solo tu può anche essere semplificato. L'importante è che tu ne
conosca i limiti per essere cosciente dei possibili errori e gestire
le eventuali incongruenze.
 
Indipendentemente da come formatti l'output, Access memorizzerà sempre
una data/ora. Certo: se immetti solo l'orario 12:00, il numero
memorizzato sarà 0,5 e così via. Il problema ti salterà fuori se
vorrai poi totalizzare le ore ...
 
Mi fa un po' paura il fatto che se l'ora "Alle" è inferiore all'ora
"Dalle" il programma automaticamente salti al primo giorno successivo.
 
È concettulmante sbagliato memorizzare in tabella dati ridondanti (le
ore lavorate sono teoricamente calcolabili conoscendo l'orario
iniziale e l'orario finale).
 
Anche excel, in cui esporterai i dati, gestisce in questo modo la
data/ora. Qui è molto facile che qualcuno vorrà totalizzare le ore,
quindi guardati la formattazione che dovrai usare.
 
Tenendo ben presente tutto questo, potresti lo stesso ritenere di
iniziare in questo modo "semplificato", poi con il tempo vedere cosa
succede ... se ho ben capito la parte importante saranno i dati che
saranno esportati nel foglio elettronico.
 
Ciao.
Alberto S