1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

MySQL registos entre duas datas

Discussão em 'Programação' iniciada por zbenta, 17 de Junho de 2008. (Respostas: 8; Visualizações: 2404)

  1. zbenta

    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.
     
  2. samahong

    samahong Power Member

    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')
     
  3. zbenta

    zbenta Power Member

    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
     
  4. thesmile

    thesmile Power Member

    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
     
  5. zbenta

    zbenta Power Member

    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.
     
  6. JPBImpe

    JPBImpe What is folding?

    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 :)
     
  7. thesmile

    thesmile Power Member

    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: 18 de Junho de 2008
  8. AliFromCairo

    AliFromCairo Power Member

    Boas, utiliza o tipo de dados datetime para as datas. A query não faz grande sentido se as coluna forem do tipo varchar.
     
  9. samahong

    samahong Power Member



    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.
     

Partilhar esta Página