SQL Datetime

domenica 06 agosto 2006 - 08.42

LeonDom Profilo | Senior Member

ciao ragazzi ho questo problemino con delle dati in sqlserver:

ho due campi datetime, composti in questo modo 01/01/2006 10.10.00 , se in uno di questi due campi volessi prendere un range di date con il between mi salta l'ultimo giorno... mi spiego meglio

se volessi prendere da 01/01/2006 a 31/01/2006 con un between (Es: Select ........ WHERE CData1 BETYWEEN '01/01/2006' AND '31/01/2006' non mi prende il 31/06/2006 perche non lo trova compreso nel range che gli passo in quanto ha l'agguiunta dell'ora...

vi chiedo esiste un modo pulito per ovviare a questo inconveniente?
LeonDom

us01739 Profilo | Expert

Prova così:

Select ........ WHERE (CData1 >= '01/01/2006' AND CData1 <= '31/01/2006')

bye
---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

lbenaglia Profilo | Guru

>ciao ragazzi ho questo problemino con delle dati in sqlserver:
>
>ho due campi datetime, composti in questo modo 01/01/2006 10.10.00
>, se in uno di questi due campi volessi prendere un range di
>date con il between mi salta l'ultimo giorno... mi spiego meglio
>
>se volessi prendere da 01/01/2006 a 31/01/2006 con un between
>(Es: Select ........ WHERE CData1 BETYWEEN '01/01/2006' AND '31/01/2006'
>non mi prende il 31/06/2006 perche non lo trova compreso nel
>range che gli passo in quanto ha l'agguiunta dell'ora...
>
>vi chiedo esiste un modo pulito per ovviare a questo inconveniente?

Ciao LeonDom,

come giustamente hai notato i datatype datetime e smalldatetime contengono sia l'informazione data che l'informazione oraria, ma con validità e precisione differenti:

datetime
--------
Range di validità: 1 gennaio 1753 - 31 dicembre 9999 con una precisione pari a 0.00333 secondi.
Bytes occupati: 8 (2 coppie di interi di 4 bytes)
- i primi 4 per la memorizzazione dei giorni prima o dopo l'1 gennaio 1900
- gli altri 4 per la memorizzazione dei millisecondi dopo la mezzanotte

smalldatetime
-------------
Range di validità: 1 gennaio 1900 - 6 giugno 2079 con una precisione al minuto.
Bytes occupati: 4 (2 coppie di interi di 2 bytes)
- i primi 2 per la memorizzazione dei giorni dopo l'1 gennaio 1900
- gli altri 2 per la memorizzazione dei minuti dopo la mezzanotte

Come vedi le date sono memorizzate internamente come 2 coppie di interi.
Quella che tu vedi "nel db" non è altro che una formattazione di questi interi effettuata dal client.

Ora, supponiamo che la tua colonna sia di tipo datetime.
Se voglio recuperare tutte le righe comprese in un certo range di date dovrò partire dalla mezzanotte della data minore (00:00:00.000 ma si può anche evitare di specificare) fino all'ultimo "tick" della data maggiore (23:59:59.997).

Quindi la tua query sarà:

SELECT... FROM... WHERE CData1 BETWEEN '20060101' AND '20060131 23:59:59.997'

Come puoi notare ho specificato le date nel formato ANSI SQL-92: YYYYMMDD
Questo formato è indipendente dalle impostazioni di lingua assegnate alla login utilizzata per accedere a SQL Server.
Se vuoi capire nei dettagli il funzionamento dei datatype datetime e smalldatetime leggi molto attentamente gli articoli di Kalen Delaney contenuti in questo tip:
http://www.dotnethell.it/tips/SQLServerDates.aspx

Ciao!

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

LeonDom Profilo | Senior Member

Ti ringrazio per la tua spiegazione, PERFETTA!!!!


Grazie 1000
LeonDom
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5