Newsgroup: it.comp.appl.access
Titolo: Problemi con le date e l'ora

Salve,
sono alle prese con un problema che apparentemente è di semplice soluzione...ma
le ho provate tutte senza esito!
Il mio problema è il seguente: ho costruito un database per verificare gli
accessi ad un servizio; i record sono composti da: id utente, data, ora
ingresso, ora uscita.
Il mio problem è quello di elaborare 1 query che calcoli il numero totale di ore
in cui si è usufruito del servizio durante un mese (che si può specificare
tramite 1 casella).
Attualmente ho utilizzato:
SELECT id_utente, SUM (ORA_Uscita-Ora_Ingresso) AS ORE
FROM Accessi
WHERE DatePart("m",data)=Mese_scelto
....
L'errore riportato è di incompatibilità fra i dati immessi nel criterio di
selezione.
Dov'è l'inghippo? Eiste qualche funzione predefinita che effettua questo calcolo
? (P.S. ORA_Ingresso e ORA_Uscita sono dichiarati come DATE).
Grazie 1000
@nto

Dov'è l'inghippo? Eiste qualche funzione predefinita che effettua questo calcolo
probabilmente datepart restituisce un intero e tu hai usato una
stringa come criterio...
--
non studio non lavoro non guardo la tv
non vado al cinema non faccio sport
----------------------------------------
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access

Due considerazioni:
SELECT id_utente, SUM (ORA_Uscita-Ora_Ingresso) AS ORE
FROM Accessi
WHERE DatePart("m",data)=Mese_scelto
non mi convince per vari motivi:
1) Bisogna eseguire le operazioni sulle ore in modo appropriato:
SELECT id_utente, SUM
(datediff("n",timevalue(Ora_Ingresso),TimeValue(ORA_Uscita))) AS ORE
FROM Accessi
WHERE DatePart("m",data)=Mese_scelto
2) Nomi pericolosi come ORE e soprattutto DATA vanno assolutamente evitati,
quindi cambia il nome al campo DATA e nella query utilizza un nome di
variabile differente da ORE:
SELECT id_utente, SUM
(datediff("n",TimeValue(Ora_Ingresso),TimeValue(ORA_Uscita))) AS OreServizio
FROM Accessi
WHERE DatePart("m",DataServizio)=Mese_scelto
3) Tra dodici mesi sarai nei guai, perché stai effettuando il test soltanto
sul mese e quindi nella query si sommeranno tutte le ore di Ottobre 2000,
2001, ecc...:
SELECT id_utente, SUM
(datediff("n",TimeValue(Ora_Ingresso),TimeValue(ORA_Uscita))) AS OreServizio
FROM Accessi
WHERE DateDiff("m",DataServizio,DataScelta)=0
n.b.: DataScelta deve essere una data qualsiasi (tipicamente fine mese) del
mese di elaborazione, ma č indispensabile che oltre al mese si specifichi
anche l'anno.
4) Per tutte le traversie che ho passato in sei anni di Access e rilevazione
presenze, ti consiglio di normalizzare tutte le date con la datevalue, in
modo di essere sicuro del risultato che vuoi ottenere. Le query saranno
leggermente piů lente, ma ci sono vari buchi segnalati della microsoft
(loro, con termine eufemistico, li chiamavano knowledge-base) che mi hanno
convinto ad essere piů che prudente con le date. Ti dico solo questa perla:
quando, in Access 1.1 (ma stiamo parlando del mesozoico, comunque) si
eseguiva una differenza in giorni tra date delle quali una aveva superato
mezzogiorno, allora il numero di giorni veniva aumentato di uno. Quindi, per
ultimo io opterei per:
SELECT id_utente, SUM
(datediff("n",TimeValue(Ora_Ingresso),TimeValue(ORA_Uscita))) AS OreServizio
FROM Accessi
WHERE DateDiff("m",DateValue(DataServizio),DateValue(DataScelta))=0
Spero di non aver dimenticato nulla. Se hai dubbi possiamo risentirci senza
problemi.
Ciao e buon lavoro
Antonio Misericordia
-- 
Posted from 
smtp4.libero.it
 [193.70.192.54] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG