[Resolvido] Between em duas colunas

Boa tarde!

Galera seguinte, estou tentando fazer uma seleção entre datas, só que em duas colunas diferentes, mas tô meio perdido. Já procurei em tudo quanto foi lugar, mas não achei nada parecido como eu quero.

Se for possível esse tipo de operação, e se alguém puder mim ajudar agradeço.
Segue o código SQL que estou utilizando:

select * from minhaTabela where colunaInicio between ? and ?;

//Mas queria achar o intervalo entre duas colunas tipo:
//select * from minhaTabela where colunaInicio between ? and colunaFim between ?;

Qualquer ajuda ou sugestão é bem vinda!

SELECT *
FROM minhaTabela
WHERE colunaInicio > ?
AND colunaFim < ?

att,
Avila

[quote=Avila82]SELECT *
FROM minhaTabela
WHERE colunaInicio > ?
AND colunaFim < ?

att,
Avila[/quote]

Avila muito obrigado pela resposta!

Porém resolveu parte do meu problema. O que esta acontecendo agora:
Ex:
tenho uma data inicio = 2012-09-18 15:00:00
data fim = 2012-09-18 15:50:00

Quando faço a pesquisa entre esses valores retorna o que eu quero! :slight_smile:
Porém, se na pesquisa estiver assim :

data inicio = 2012-09-18 15:20:00
data fim = 2012-09-18 15:50:00

Ele não retorna nada. Pois quero evitar conflitos de horario.
Teria alguma sugestão?
Mais uma vez obrigado pela atenção!

Galera, conseguir avança mais um pouco. A consulta esta dessa forma agora:

select * from minhatabela where (colunaInicio between ? and ?) OR (colunaFim between ? and ?);

Dessa forma ele retorna todo que esta no intervalo entre essas datas. Porém surgiu outro erro.

Ex: tenho o seguinte registro:

data inicio = 2012-09-18 01:00:00 //O dia todo
data fim = 2012-09-18 23:00:00

Quando pesquiso entre esses datas tudo beleza, mas quando mudo a pesquisa para:

data inicio = 2012-09-18 02:00:00
data fim = 2012-09-18 22:00:00

A pesquisa já não retorna nada. :shock:

Teoricamente era pra retornar tudo que estar entre as datas de pesquisa?! Ou não ?

???

vamos ver se entendi…

você tem alguma linha que o horário está entre 15:20:00 e 15:50:00 do dia 12/09/2012 e não está listando?

se for isso a data inicial que você está passando pode estar batendo com a data que está no banco então terias de usar o >= para que esta seja listada.

então ficaria assim:

SELECT *
FROM minhaTabela
WHERE colunaInicio >= ?
AND colunaFim <= ?

neste caso 15:20:00 e 15:50:00 estariam entrando na pesquisa e não como antes que listaria de 15:20:01 à 15:49:59

att,
Ávila

[quote=CharlesEduardo][quote=Avila82]SELECT *
FROM minhaTabela
WHERE colunaInicio > ?
AND colunaFim < ?

att,
Avila[/quote]

Avila muito obrigado pela resposta!

Porém resolveu parte do meu problema. O que esta acontecendo agora:
Ex:
tenho uma data inicio = 2012-09-18 15:00:00
data fim = 2012-09-18 15:50:00

Quando faço a pesquisa entre esses valores retorna o que eu quero! :slight_smile:
Porém, se na pesquisa estiver assim :

data inicio = 2012-09-18 15:20:00
data fim = 2012-09-18 15:50:00

Ele não mim retorna nada. Pois quero evitar conflitos de horario.
Teria alguma sugestão?
Mais uma vez obrigado pela atenção![/quote]

Para mim, você deveria tratar isso antes de inserir no banco. Se colocarem o fim antes do inicio, você altera troca as datas uma pela outra.

[quote=Avila82]vamos ver se entendi…

você tem alguma linha que o horário está entre 15:20:00 e 15:50:00 do dia 12/09/2012 e não está listando?

se for isso a data inicial que você está passando pode estar batendo com a data que está no banco então terias de usar o >= para que esta seja listada.

então ficaria assim:

SELECT *
FROM minhaTabela
WHERE colunaInicio >= ?
AND colunaFim <= ?

neste caso 15:20:00 e 15:50:00 estariam entrando na pesquisa e não como antes que listaria de 15:20:01 à 15:49:59

att,
Ávila
[/quote]

Avila obrigado pela atenção!
Cara já tinha tentado isso, porém não deu certo, então fiz assim:

select * from minhatabela where (colunaInicio between ? and ?) OR (colunaFim between ? and ?);

Aqui ele retorna o que tem entres as datas pesquisadas.

Ex: tenho o seguinte registro:

data inicio = 2012-09-18 01:00:00 //O dia todo
data fim = 2012-09-18 23:00:00

Quando pesquiso entre esses datas tudo beleza, mas quando mudo a pesquisa para:

data inicio = 2012-09-18 02:00:00
data fim = 2012-09-18 22:00:00

A pesquisa já não mim retorna nada.

[quote=ErickRAR][quote=CharlesEduardo][quote=Avila82]SELECT *
FROM minhaTabela
WHERE colunaInicio > ?
AND colunaFim < ?

att,
Avila[/quote]

Avila muito obrigado pela resposta!

Porém resolveu parte do meu problema. O que esta acontecendo agora:
Ex:
tenho uma data inicio = 2012-09-18 15:00:00
data fim = 2012-09-18 15:50:00

Quando faço a pesquisa entre esses valores retorna o que eu quero! :slight_smile:
Porém, se na pesquisa estiver assim :

data inicio = 2012-09-18 15:20:00
data fim = 2012-09-18 15:50:00

Ele não mim retorna nada. Pois quero evitar conflitos de horario.
Teria alguma sugestão?
Mais uma vez obrigado pela atenção![/quote]

Para mim, você deveria tratar isso antes de inserir no banco. Se colocarem o fim antes do inicio, você altera troca as datas uma pela outra.[/quote]

Erick obrigado pela dica, porém já faço isso! Antes de inserir verifico que a data inicio é menor que a do fim.

Charles…

isso está ocorrendo pq você está passando datas que não contemplam na pesquisa:

se tu tens que a data inicio é 01:00:00 e data fim 23:00 e estás passando valores 02:00:00 e 22:00:00, quando tu faz um (colunaInicio between ? and ?) OR (colunaFim between ? and ?) o coluna inicio não está entre 2 e 22 hs e o coluna fim nao está entre 2 e 22 hs tb… :slight_smile:

att,
Ávila

Estava vendo esta msg sua:


Porém resolveu parte do meu problema. O que esta acontecendo agora:
Ex:
tenho uma data inicio = 2012-09-18 15:00:00
data fim = 2012-09-18 15:50:00

Quando faço a pesquisa entre esses valores retorna o que eu quero!
Porém, se na pesquisa estiver assim :

data inicio = 2012-09-18 15:20:00
data fim = 2012-09-18 15:50:00


Com a primeira query que passei ela não retornaria nada pois usa > e < entao a data fim não entraria na pesquisa pois bate igual 15:50. Porém se usares >= e <= como passei na segunda query esta linha seria retornada…

att,
Ávila

Charles, primeiro, “mim retorna” não existe, ok? Melhore o português, rapaz.
Segundo.
Pense no seguinte caso.
dtaInicio = 20/08/2012 10:00
dtaFim = 30/08/2012 8:00

1° caso:
dtaParam = 25/08/2012 7:00

Eu faria assim:

SELECT * FROM tabela WHERE dtaParam >= dtaInicio AND dtaParam <= dtaFim

E teria resultado, afinal, 25/08/2012 7:00 é maior que a dtaInicio e menor que a dtaFim

2° caso:
dtaParam = 20/08/2012 7:00

Eu faria assim:

SELECT * FROM tabela WHERE dtaParam >= dtaInicio AND dtaParam <= dtaFim

E não teria resultado, visto que, dtaParam é menor que a dtaInicio.

3° caso:
dtaParam = 30/08/2012 7:00

Eu faria assim:

SELECT * FROM tabela WHERE dtaParam >= dtaInicio AND dtaParam <= dtaFim

E teria resultado, visto que, dtaParam é maior que dtaInicio e menor que a dtaFim.

4° caso:
dtaParam = 30/08/2012 20:00

Eu faria assim:

SELECT * FROM tabela WHERE dtaParam >= dtaInicio AND dtaParam <= dtaFim

E não teria resultado, visto que, dtaParam é maior que dtaFim.

Saca?
Se você usar o operador OR a afirmativa precisa ser verdade em apenas um dos lados (ou seja, se ela for maior que a dtaFim, obrigatoriamente é maior que a dtaFim e, se for menor que a dtaInicio, obrigatoriamente é menor que a dtaFim). O melhor a usar é o operador AND que só permite que um resultado seja retornado SE e somente SE ambos os lados forem verdadeiros.

[quote=drsmachado]Charles, primeiro, “mim retorna” não existe, ok? Melhore o português, rapaz.
Segundo.
Pense no seguinte caso.
dtaInicio = 20/08/2012 10:00
dtaFim = 30/08/2012 8:00

1° caso:
dtaParam = 25/08/2012 7:00

Eu faria assim:

SELECT * FROM tabela WHERE dtaParam >= dtaInicio AND dtaParam <= dtaFim

E teria resultado, afinal, 25/08/2012 7:00 é maior que a dtaInicio e menor que a dtaFim

2° caso:
dtaParam = 20/08/2012 7:00

Eu faria assim:

SELECT * FROM tabela WHERE dtaParam >= dtaInicio AND dtaParam <= dtaFim

E não teria resultado, visto que, dtaParam é menor que a dtaInicio.

3° caso:
dtaParam = 30/08/2012 7:00

Eu faria assim:

SELECT * FROM tabela WHERE dtaParam >= dtaInicio AND dtaParam <= dtaFim

E teria resultado, visto que, dtaParam é maior que dtaInicio e menor que a dtaFim.

4° caso:
dtaParam = 30/08/2012 20:00

Eu faria assim:

SELECT * FROM tabela WHERE dtaParam >= dtaInicio AND dtaParam <= dtaFim

E não teria resultado, visto que, dtaParam é maior que dtaFim.

Saca?
Se você usar o operador OR a afirmativa precisa ser verdade em apenas um dos lados (ou seja, se ela for maior que a dtaFim, obrigatoriamente é maior que a dtaFim e, se for menor que a dtaInicio, obrigatoriamente é menor que a dtaFim). O melhor a usar é o operador AND que só permite que um resultado seja retornado SE e somente SE ambos os lados forem verdadeiros.[/quote]

drsmachado obrigado pelas dicas, inclusive a de português… :slight_smile:

Vou fazer alguns testes!

Consegui resolver! \o/

Obrigado a todos que postaram!