Problema con date

giovedì 16 aprile 2009 - 10.25

marko80 Profilo | Junior Member

Ciao a tutti!
Mi ritrovo con un campo di tipo data/ora (gg/mm/aaa hh.mm.ss) sul quale sto tentando di fare un filtro stupidissimo.
Dall'inizio ho notato che questo campo è popolato a volte con gg/mm/aaa hh.mm.ss e altre solo gg/mm/aaa.
Facendo una query velocissima e impostando un filtro su tale campo (>= 01/03/2009 and <= 10/03/2009) mi restituisce i valori fino al 09/03/2009!
Inserendo anche l'ora invece esce corretto. Perchè??
Non capisco questa cosa visto che la data del 10/03 compare piu volte con orari differenti.
Mi basterebbe anche riuscire a estrapolarmi solo la data e poi farmi il filtro.
Grazie

lbenaglia Profilo | Guru

>Mi ritrovo con un campo di tipo data/ora (gg/mm/aaa hh.mm.ss)
>sul quale sto tentando di fare un filtro stupidissimo.
Che DBMS utilizzi?

>Dall'inizio ho notato che questo campo è popolato a volte con
>gg/mm/aaa hh.mm.ss e altre solo gg/mm/aaa.
>Facendo una query velocissima e impostando un filtro su tale
>campo (>= 01/03/2009 and <= 10/03/2009) mi restituisce
>i valori fino al 09/03/2009!
>Inserendo anche l'ora invece esce corretto. Perchè??
Perché internamente le date sono gestite come numeri decimali a partire da una base date (in SQL Server la base date è 1900-01-01 che corrisponde a 0).
La condizione che hai scritto restituisce tutte le righe per cui la data è compresa tra la mezzanotte dell' 1 marzo e del 10 marzo.
Tutte le righe per cui la data è successiva alla mezzanotte del 10 marzo NON saranno restituite.

>Non capisco questa cosa visto che la data del 10/03 compare piu
>volte con orari differenti.
>Mi basterebbe anche riuscire a estrapolarmi solo la data e poi
>farmi il filtro.
Brutta soluzione dato che dovresti applicare una funzione alla colonna data, rendendo inutili eventuali indici definiti su di essa.
Se ti interessa recuperare le righe della giornata del 10 marzo è sufficiente incrementare la data di 1 giorno togliendo l'"=".
In SQL Server scriverei:

SELECT... FROM... WHERE ColData >= '20090301' AND ColData < '20090311';

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

marko80 Profilo | Junior Member

Ti ringrazio per la risposta.
Mi sono dimenticato di scrivere che il tutto è fatto in access.
Non c'è un modo per ovviare a questo problema? (formula o delle righe di codice)
La data min e la data max le imputa l'utente in due caselle di testo di una form
Mi sembra brutto che l'utente debba digiatare dal 01 al 11 per avere come risultato dal 01 al 10.
Questo è il pezzo di codice che ho scritto:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Grazie

lbenaglia Profilo | Guru

>Ti ringrazio per la risposta.
>Mi sono dimenticato di scrivere che il tutto è fatto in access.
>Non c'è un modo per ovviare a questo problema? (formula o delle
>righe di codice)
Il discorso non cambia di una virgola, se non per il formato delle date che deve essere espresso come #MM/DD/YYYY# se non vuoi avere problemi con le Regional Settings

>La data min e la data max le imputa l'utente in due caselle di
>testo di una form
>Mi sembra brutto che l'utente debba digiatare dal 01 al 11 per
>avere come risultato dal 01 al 10.
L'utente no, ma lo farai tu prima di passarlo al comando SQL mediante una banalissima DateAdd().
Inoltre ti sconsiglio caldamente di comporre dinamicamente il comando SQL se non vuoi incorrere nel noto problema del SQL Injection, piuttosto definisci una Query parametrica e valorizzane opportunamente i parametri prima di richiamarla.
http://www.dotnethell.it/articles/SQL-Injection-Tutorial-Security.aspx
http://www.dotnethell.it/forum/messages.aspx?ThreadID=13913

In Access potrai richiamare la Query Parametrica via DAO o ADO (fai una bella ricerca nell'help o su MSDN).

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5