MySQL registos entre duas datas

zbenta

Power Member
Boa tarde pessoal,
Preciso de uma ajudinha numa query em mysql.
Tenho a seguinte tabela :

TABLE `gantt_actividades` (
`actividadeid` int(11) NOT NULL AUTO_INCREMENT,
`titulo` varchar(100) DEFAULT NULL,
`datade` varchar(50) DEFAULT NULL,
`dataate` varchar(50) DEFAULT NULL,
`user` varchar(50) DEFAULT NULL,
PRIMARY KEY (`actividadeid`)

necessito de saber as actividades cuja data de inicio e fim se encontrem compreendidas entre duas datas para além disso tb desejo saber a intersecção com as actividades cujas datas de inicio e fim estejam fora do intervalo.
Matematicamente falando quero as actividades cujas datas € ]'2008-06-16 09:59:54';'2008-06-16 09:59:54'[

A query que fiz foi:
select * from gantt_actividades where user='myname'
and( datade between '2008-06-16 09:59:54' and '2008-06-16 09:59:54')
or ( dataate between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')

Mas não me devolve as actividades cujas datas pertencem ao intervalo fechado.
 
Será que é isto que pretendes?
Código:
SELECT
	*
FROM
	gantt_actividades
WHERE
	user='myname'
	[B]AND[/B] (datade between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
	AND (dataate between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
 
Código:
 		 		Será que é isto que pretendes?
 	Código:
 	SELECT
	*
FROM
	gantt_actividades
WHERE
	user='myname'
	[B]AND[/B] (datade between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
	AND (dataate between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')

Boas samahong,

Isso já eu tinha tentado.
Vou dar um exemplo onde nem esta query nem a outra que tenho funcionam, para ver se me consigo explicar melhor

Eu selecciono um intervalo por exemplo entre '2008-06-16 09:59:54' e '2008-06-27 09:59:54'.
Gostaria de saber quais as actividades que intersectam esse intervalo por exemplo uma actividade que tem inicio no dia 2008-06-16 e fim no dia 2008-06-27 deveria ser devolvida, por outro lado uma actividade que tem inicio no dia 2008-06-17 e fim no dia 2008-06-25 também deveria ser devolvida, por fim actividades com inicio no dia 2008-06-14 ou inferior e fim no dia 2008-06-30 ou superior deveriam também aparecer.

Será que me fiz entender melhor agora???

Obrigado pela vossa ajuda
 
exprimenta
Código:
select * from gantt_actividades where user='myname' 
and ( sustr(datade,1,19) between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
and ( sustr(dataate,1,19) between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')

pela definicao da tabela q colocaste a variaveis datade e dataate tao com varchar(50) e assim garantes q o intervalo deve ser analisado pelas 19 primeiras posicoes. Se o restante campo so tiver espaços ele deveria funcionar mas ve se desta forma resulta
 
exprimenta
Código:
select * from gantt_actividades where user='myname'
and ( sustr(datade,1,19) between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
and ( sustr(dataate,1,19) between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
pela definicao da tabela q colocaste a variaveis datade e dataate tao com varchar(50) e assim garantes q o intervalo deve ser analisado pelas 19 primeiras posicoes. Se o restante campo so tiver espaços ele deveria funcionar mas ve se desta forma resulta



Experimentei a query mas o mysql não reconhece o comando sustr.
 
E não era boa ideia pôr os campos data em formato data? Não creio que possas pedir ao mysql operações de datas em varchar...
Digo isto porque costumos utilizar sempre datetime 0000-00-00 00:00:00 e funciona sempre nas queries.
Mas posso estar errado :)
 
exprimenta
Código:
select * from gantt_actividades where user='myname'
and ( sustr(datade,1,19) between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
and ( sustr(dataate,1,19) between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
pela definicao da tabela q colocaste a variaveis datade e dataate tao com varchar(50) e assim garantes q o intervalo deve ser analisado pelas 19 primeiras posicoes. Se o restante campo so tiver espaços ele deveria funcionar mas ve se desta forma resulta



Experimentei a query mas o mysql não reconhece o comando sustr.

usa a funcao SUBSTRING! de forma a selecionares as 19 primeiras posiçoes..
Se puderes reconstruir a base de dados de forma a definires com data como foi sugerido (pelo
JPBImpe)
era a melhor solução

ou procura qual é a funcao substring em mysql
 
Última edição:
Código:
 		 		Será que é isto que pretendes?
 	Código:
 	SELECT
	*
FROM
	gantt_actividades
WHERE
	user='myname'
	[B]AND[/B] (datade between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
	AND (dataate between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')

Boas samahong,

Isso já eu tinha tentado.
Vou dar um exemplo onde nem esta query nem a outra que tenho funcionam, para ver se me consigo explicar melhor

Eu selecciono um intervalo por exemplo entre '2008-06-16 09:59:54' e '2008-06-27 09:59:54'.
Gostaria de saber quais as actividades que intersectam esse intervalo por exemplo uma actividade que tem inicio no dia 2008-06-16 e fim no dia 2008-06-27 deveria ser devolvida, por outro lado uma actividade que tem inicio no dia 2008-06-17 e fim no dia 2008-06-25 também deveria ser devolvida, por fim actividades com inicio no dia 2008-06-14 ou inferior e fim no dia 2008-06-30 ou superior deveriam também aparecer.

Será que me fiz entender melhor agora???

Obrigado pela vossa ajuda



Então acho que esta query serve, porque tu basicamente queres todas as actividades que de alguma maneira toquem no teu intervalo.

Código:
SELECT
	*
FROM
	gantt_actividades
WHERE
	user='myname'
	AND 
	-- Esta primeira parte apanha todas as actividades que tenham o fim ou o inicio no teu
	-- intervalo
	((datade between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
	OR (dataate between '2008-06-16 09:59:54' and '2008-06-17 09:59:54')
	-- Esta segunda parte serve para apanhar as actividades que começam e acabam 
	-- fora do teu intervalo, mas que o intersectam
	OR ('2008-06-16 09:59:54' between datade and dataate)
	OR ('2008-06-17 09:59:54' between datade and dataate))

Nota: Convém que uses mudes o tipo de dados dos campos datade e dataate para datetime.
 
Back
Topo