Pergunta

Por exemplo pode

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

selecione 5 e 10 ou eles são excluídos do alcance?

Foi útil?

Solução

O operador BETWEEN é inclusiva.

A partir Books Online:

ENTRE retorna TRUE se o valor de test_expression é maior do que ou igual ao valor de begin_expression e inferior ou igual ao valor de end_expression.

DateTime Caveat

NB: Com DateTimes você tem que ter cuidado; Se apenas uma data é dado o valor é obtido a partir de meia-noite naquele dia; Para evitar vezes em falta dentro de sua data de término, ou repetir a captura de dados do dia seguinte à meia-noite em vários intervalos, a data de término deve ser de 3 milissegundos antes da meia-noite no do dia seguinte seu até à data. 3 milissegundos, porque menos do que isso e o valor será arredondado para a meia-noite do dia seguinte.

por exemplo. para obter todos os valores dentro de junho 2016 você precisa executar:

where myDateTime between '20160601' and DATEADD(millisecond, -3, '20160701')

i.

where myDateTime between '20160601 00:00:00.000' and '20160630 23:59:59.997'

datetime2 e datetimeoffset

Subtraindo 3 ms a partir de uma data vai deixá-lo vulnerável a linhas da janela de 3 ms faltando. A solução correta é também a mais simples:

where myDateTime >= '20160601' AND myDateTime < '20160701'

Outras dicas

Sim, mas tenha cuidado ao usar entre para datas.

BETWEEN '20090101' AND '20090131'

é realmente interpretado como 00:00, ou

BETWEEN '20090101 00:00:00' AND '20090131 00:00:00'

então vai perder nada que ocorreu durante o dia de 31 de janeiro. Neste caso, você terá que usar:

myDate >= '20090101 00:00:00' AND myDate < '20090201 00:00:00'  --CORRECT!

ou

BETWEEN '20090101 00:00:00' AND '20090131 23:59:59' --WRONG! (see update!)

Atualizar : É perfeitamente possível ter registros criados dentro desse último segundo do dia, com uma data e hora tão tarde quanto 20090101 23:59:59.997 !!

Por esta razão, a abordagem BETWEEN (firstday) AND (lastday 23:59:59) não é recomendado.

Use a abordagem myDate >= (firstday) AND myDate < (Lastday+1) vez.

Boa artigo sobre este assunto aqui .

exemplo do mundo real a partir do SQL Server 2008.

As fontes de dados:

ID    Start
1     2010-04-30 00:00:01.000
2     2010-04-02 00:00:00.000
3     2010-05-01 00:00:00.000
4     2010-07-31 00:00:00.000

Inquérito:

SELECT
    *
FROM
    tbl
WHERE
    Start BETWEEN '2010-04-01 00:00:00' AND '2010-05-01 00:00:00'

Resultado:

ID    Start
1     2010-04-30 00:00:01.000
2     2010-04-02 00:00:00.000

text alt

Se você acertar isso, e realmente não quer tentar e lidar com a adição de um dia em código, em seguida, deixar o DB fazê-lo ..

myDate >= '20090101 00:00:00' AND myDate < DATEADD(day,1,'20090101 00:00:00')

Se você não incluir a parte do tempo: certifique-se que faz referência a meia-noite. Caso contrário, você pode simplesmente omitir a tempo:

myDate >= '20090101' AND myDate < DATEADD(day,1,'20090101')

e não se preocupar com isso.

ENTRE (Transact-SQL)

especifica um ( n ) ( inclusiva ) gama de teste.

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

Argumentos

test_expression

A expressão para testar na gama definida por begin_expression e end_expression. test_expression deve ser o mesmo tipo de dados, como ambos begin_expression e end_expression.

NOT

especifica que o resultado do predicado ser negada.

begin_expression

é qualquer expressão válida. begin_expression devem ser os mesmos dados digitar tanto como test_expression e end_expression.

end_expression

é qualquer expressão válida. end_expression devem ser os mesmos dados digitar tanto como test_expression e begin_expression.

AND

Atua como um espaço reservado que indica test_expression deve ser dentro do intervalo indicado pela begin_expression e end_expression.

Observações

Para especificar uma gama exclusiva, use o maior que (>) e menor que operadores (<). Se qualquer entrada para o ENTRE ou não, entre predicado é NULL, o resultado é desconhecido.

Resultado Valor

ENTRE retorna TRUE se o valor de test_expression é maior do que ou igual ao valor de begin_expression e inferior ou igual ao valor de end_expression.

NÃO ENTRE retorna TRUE se o valor de test_expression é menor que o valor de begin_expression ou maior do que o valor de end_expression.

Se o tipo de dados da coluna é de data e hora, então você pode fazer isso se segue para eliminar o tempo de data e hora e comparar entre intervalo de data única.

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

Isso inclui limites.

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

Eu sempre usei o seguinte:

WHERE myDate ENTRE startDate E (endDate + 1)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top