2009-04-14 13 views

risposta

220

L'operatore BETWEEN è incluso.

Da documentazione in linea:

TRA restituisce TRUE se il valore di test_expression è maggiore o uguale al valore di begin_expression e minore o uguale al valore di END_EXPRESSION.

DateTime Caveat

NB: Con DateTimes bisogna stare attenti; se viene data solo una data, il valore è preso a mezzanotte in quel giorno; per evitare tempi mancanti entro la data di fine o ripetere l'acquisizione dei dati del giorno successivo a mezzanotte in intervalli multipli, la data di fine dovrebbe essere 3 millisecondi prima della mezzanotte del giorno successivo alla data corrente. 3 millisecondi perché qualsiasi valore inferiore a questo e il valore verrà arrotondato alla mezzanotte del giorno successivo.

ad es. per ottenere tutti i valori all'interno di giugno 2016 si avrebbe bisogno di correre:

where myDateTime between '2016-06-01' and dateadd(millisecond, -3, '2016-07-01')

cioè

where myDateTime between '2016-06-01 00:00:00.000' and '2016-07-01 23:59:59.997'

+5

Quando si utilizza TRA filtrare DateTimes tra due date, si può anche lanciare il DateTime a una data, ad esempio: dove CONVERT (DATA, Data) TRA '2017/09/01' e '2017/09/30 'Questo approccio rende irrilevante l'elemento temporale di DateTime – Pete

10

BETWEEN (Transact-SQL)

Specifica un (n) (compreso) intervallo da testare.

test_expression [ NOT ] BETWEEN begin_expression AND end_expression 

Argomenti

test_expression 

è l'espressione per verificare nell'intervallo definito da begin_expression e END_EXPRESSION. test_expression deve essere lo stesso tipo di dati di entrambi begin_expression e end_expression.

NOT 

Specifica che il risultato del predicato deve essere negato.

begin_expression 

È qualsiasi espressione valida. begin_expression deve essere lo stesso tipo di dati come test_expression e end_expression.

end_expression 

È qualsiasi espressione valida.end_expression deve essere lo stesso tipo di dati come test_expression e begin_expression.

AND 

funge da riferimento che indica test_expression dovrebbe essere all'interno dell'intervallo indicato con begin_expression e END_EXPRESSION.

Osservazioni

Per specificare una gamma esclusiva, utilizzare il maggiore di (>) e meno di operatori (<). Se qualsiasi input per il predicato TRA o NON TRA è NULL, il risultato è SCONOSCIUTO.

Risultato Valore

tra i rendimenti VERO se il valore di test_expression è maggiore o uguale al valore di begin_expression e minore o uguale al valore di END_EXPRESSION.

NON TRA restituisce VERO se il valore di test_expression è inferiore al valore di begin_expression o superiore rispetto al valore di END_EXPRESSION.

237

Sì, ma attenzione quando si utilizza tra le date.

BETWEEN '01/01/2009' AND '01/31/2009' 

è davvero interpretato come 00:00, o

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 00:00:00' 

così mancherà tutto ciò che si è verificato nel corso della giornata di 31 gennaio. In questo caso, si dovrà utilizzare:

myDate >= '01/01/2009 00:00:00' AND myDate < '02/01/2009 00:00:00' --CORRECT! 

o

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 23:59:59' --WRONG! (see update!) 

UPDATE: E 'del tutto possibile avere record creati all'interno di tale ultimo secondo della giornata, con un datetime più tardi come 01/01/2009 23:59:59.997 !!

Per questo motivo, l'approccio BETWEEN (firstday) AND (lastday 23:59:59) non è consigliato.

Utilizzare invece l'approccio myDate >= (firstday) AND myDate < (Lastday+1).

Buono article on this issue here.

+1

Problemi simili con le stringhe 'WHERE col BETWEEN' a 'AND' z'' escluderà la maggior parte delle righe z per esempio. –

+7

Naturalmente questo punto è giusto; ma non dovrebbe sorprendere se lavori con datetimes. È analogo notare che 'BETWEEN 5 AND 10' non include' 10.2' ... –

+4

'CAST'ing the' datetime' come un 'DATE' funzionerebbe:' CAST (DATE_TIME_COL AS DATE) TRA '01/01/2009 'AND '01/31/2009''. – craig

16

esempio del mondo reale da SQL Server 2008.

alt text

+0

+1 grazie mille ... –

+0

Non ho ricevuto risposta, a dire il vero. Forse il mio provider internet ha nascosto il tuo screenshot se ne hai pubblicato uno. –

+0

@Anar, il link diretto all'immagine è http://imgur.com/sTKRO.png. –

12

se ti ha colpito questa, e in realtà non vuole cercare di gestire l'aggiunta di un giorno nel codice, poi lasciare che il DB farlo ..

myDate >= '01/01/2009 00:00:00' AND myDate < DATEADD(day,1,'01/01/2009 00:00:00') 
3

Se il tipo di dati della colonna è datetime allora si può fare questo a seguito di eliminare il tempo da datetime e confrontare tra solo intervallo di date.

where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date) 
+1

Nota che non è [sargable] (http://en.wikipedia.org/wiki/Sargable). –

+0

Funziona meglio di aggiungere +1 alla data di fine. Sono d'accordo con Andrew Morton - se non è sargabile, potrebbe migliorare le prestazioni per cambiare il tipo di dati della colonna o aggiungere una seconda colonna con solo le date pre-calcolate. – Volkirith

-2

ho sempre usato questo:

DOVE myDate TRA startDate E (endDate + 1)

0

Fa comprende confini.

declare @startDate date = cast('15-NOV-2016' as date) 
declare @endDate date = cast('30-NOV-2016' as date) 
create table #test (c1 date) 
insert into #test values(cast('15-NOV-2016' as date)) 
insert into #test values(cast('20-NOV-2016' as date)) 
insert into #test values(cast('30-NOV-2016' as date)) 
select * from #test where c1 between @startDate and @endDate 
drop table #test 
RESULT c1 
2016-11-15 
2016-11-20 
2016-11-30 


declare @r1 int = 10 
declare @r2 int = 15 
create table #test1 (c1 int) 
insert into #test1 values(10) 
insert into #test1 values(15) 
insert into #test1 values(11) 
select * from #test1 where c1 between @r1 and @r2 
drop table #test1 
RESULT c1 
10 
11 
15 
Problemi correlati