Brunerd 0 Report post Posted October 28, 2013 Ola amigos, banco de dados não é minha especialidade então me surge esta duvida: \Preciso verificar se uma data esta dentro de um periodo já gravado anteriormente no banco. Existe algum comando para isso...? P q preciso gravar as informações mas se o periodo já estiver gravado devo barrar o usuário. Desde já agradeço. Share this post Link to post Share on other sites
allex_carvalho 124 Report post Posted October 28, 2013 Verificar intervalo use o BETWEEN. SELECT * FROM `clientes` WHERE `data_cadastro` BETWEEN '2013-01-01' AND '2013-01-31' Lembrando que para usar o between os campos para comparação precisam ser date. Share this post Link to post Share on other sites
Brunerd 0 Report post Posted October 28, 2013 Es a questão amigo, eu preciso que ele compare não uma data dentro de um periodo... e sim se um periodo sobrepõe outro... exemplo eu tenho o gravado intervalo.... 2012-01-05 e 2012-01-10 ... se a criatura digitar 2012-01-03 e 2012-01-15 deve retornar algum resultado por que um período sobrepõe outro. ou mesmo que ele digite 2011-12-30 e 2012-01-02.... ou 2011-12-30 e 2012-01-06... Espero que tenha facilitado a compreenção. Acho q não soube explicar na primeira msg :P mas acho q agora da pra entender a real duvida... Share this post Link to post Share on other sites
Motta 645 Report post Posted October 28, 2013 supondo tabela -------- data_de data_ate se quer testar o intervalo '01/10/2013' a '29/10/2013' faca select * from tabela where (('01/10/2013' between data_de and data_ate) or ('29/10/2013' between data_de and data_ate)) Ajudou ? Share this post Link to post Share on other sites
Brunerd 0 Report post Posted October 28, 2013 supondo tabela--------data_dedata_atese quer testar o intervalo '01/10/2013' a '29/10/2013' faca select *from tabelawhere (('01/10/2013' between data_de and data_ate) or ('29/10/2013' between data_de and data_ate)) Ajudou ? Amigo agradeço a ajuda mas ainda assim o problema persiste: exemplo: Suponhamos que possuo essas datas cadastradas nos campos data_de = '2013-10-10' e data_ate = '2013-10-20' e o usuario utiliza o seguinte periodo :2013-10-01 à 2013-10-25... repare que o periodo que o usuario digitou sobrepõe o que esta no banco de dados mas: select * from tabela where ( ('2013-10-01' between data_de and data_ate) OR ('2013-10-25' between data_de and data_ate) ) Nenhum das instruções retornaria true... ('2013-10-01' between 2013-10-10' AND '2013-10-20')False ('2013-10-25' between 2013-10-10' AND '2013-10-20')False Share this post Link to post Share on other sites
Motta 645 Report post Posted October 28, 2013 OK , inverta faça select * from tabela where ((data_de between '2013-10-01' and '2013-10-25') or (data_ate between '2013-10-01' and '2013-10-25')) Share this post Link to post Share on other sites
Brunerd 0 Report post Posted October 28, 2013 Mesma coisa, se o usuário digitar 2013-10-15 e 2013-10-17 vou ter 3 dias que sobrepõem o periodo já registrado 2013-10-10 e 2013-10-20.. E não vai retornar nenhum resultado tbm Share this post Link to post Share on other sites
Motta 645 Report post Posted October 28, 2013 2012-01-05 - 2013-10-15 AND 2013-10-17 2012-01-10 - 2013-10-15 AND 2013-10-17 2012-01-05-2012-01-10 e 2013-10-15 2013-10-17 não se sobre põe ?! Quais os valores data de/ate gravadas parametros de ate usuário ? Share this post Link to post Share on other sites
Brunerd 0 Report post Posted October 28, 2013 Digamos que tenho o periodo gravado data_de = 2013-10-10 e data_ate = 2013-10-20 e o usuario digita 2013-10-15 e 2013-10-17 repare que as datas (2013-10-15 , 2013-10-16, 2013-10-17) estão contidas dentro do periodo ja cadastrado (data_de = 2013-10-10 e data_ate = 2013-10-20) porem nesse seu exemplo não retornaria nenhum registro. select * from tabela where ( (2013-10-10 between '2013-10-15' and '2013-10-17') OR (2013-10-20 between '2013-10-15' and '2013-10-17') ) Share this post Link to post Share on other sites
Motta 645 Report post Posted October 28, 2013 caimos no #4 ... select * from tabela where (('2013-10-15' between data_de and data_ate) or ('2013-10-17' between data_de and data_ate)) -- select * from tabela where (('2013-10-15' between '2013-10-10' and '2013-10-20') or ('2013-10-17' between '2013-10-10' and '2013-10-20')) tenho quase certeza que o #4 funciona pois já fiz algo assim. Share this post Link to post Share on other sites
Brunerd 0 Report post Posted October 28, 2013 Na verdade tenho que abranger os dois casos! Share this post Link to post Share on other sites
Motta 645 Report post Posted October 28, 2013 Creio que o #4 basta parametro_de between data_de and data_ate or parametro_ate between data_de and data_ate Tinha um post aqui no Imasters que já se tinha discutido isto Share this post Link to post Share on other sites
Brunerd 0 Report post Posted October 28, 2013 Fiz alguns testes aqui apenas com o exemplo #4 não funcionou devido ao que eu havia explicado, porem uni as duas condições com o operador OR e funcionou como esperado, obrigado pela ajuda amigo. Abraços e até. Share this post Link to post Share on other sites
Motta 645 Report post Posted October 28, 2013 Funcionou, deixa quieto ... :) Share this post Link to post Share on other sites