Per esempio puòIl "tra" di MS SQL Server include i limiti dell'intervallo?
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
selezionare 5 e 10 o che sono esclusi dalla gamma?
Per esempio puòIl "tra" di MS SQL Server include i limiti dell'intervallo?
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
selezionare 5 e 10 o che sono esclusi dalla gamma?
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'
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.
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.
Problemi simili con le stringhe 'WHERE col BETWEEN' a 'AND' z'' escluderà la maggior parte delle righe z per esempio. –
Naturalmente questo punto è giusto; ma non dovrebbe sorprendere se lavori con datetimes. È analogo notare che 'BETWEEN 5 AND 10' non include' 10.2' ... –
'CAST'ing the' datetime' come un 'DATE' funzionerebbe:' CAST (DATE_TIME_COL AS DATE) TRA '01/01/2009 'AND '01/31/2009''. – craig
esempio del mondo reale da SQL Server 2008.
+1 grazie mille ... –
Non ho ricevuto risposta, a dire il vero. Forse il mio provider internet ha nascosto il tuo screenshot se ne hai pubblicato uno. –
@Anar, il link diretto all'immagine è http://imgur.com/sTKRO.png. –
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')
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)
Nota che non è [sargable] (http://en.wikipedia.org/wiki/Sargable). –
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
ho sempre usato questo:
DOVE myDate TRA startDate E (endDate + 1)
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
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