|
| Publicidade |
|
|
|
Comentários de Usuários
Boa
Boa a idéia e o artigo também!! Seria bom se postassem mais artigos sobre o SQL/mySQL. Valeu ae!
Um Pequeno Problema
Quando você está tentando comparar se uma data vem antes ou depois da outra utilizando dia, mes e ano separados, é meio difícil conseguir o resultado correto utilizando apenas 2 ifs. Para você acreditar nisso, podemos lançar um exemplo onde a data de expiração de um usuário seja 01/12/2003 (dd/mm/yyyy) e a data atual seja 15/11/2003
Neste caso o usuário ainda está ativo. Mas este select retorna o resultado que ele já está cancelado. pois ('2003' = '2003' and '12' >= '11' and '01' >= '15') vai retornar "0". O correto seria por no select -> IF(expiraano > '$ano', 1, 0) as ano, IF(expiraano = '$ano' and expirames > '$mes', 1, 0) as mes, IF(expiraano = '$ano' and expirames = '$mes' and expiradia > '$dia', 1, 0) dia e no having colocar -> ano = 1 or mes = 1 or dia = 1 Mas a idéia é boa... qual data vem antes uma data usando os três campos, é meio difícil de conseguir o result
Complemento!
Só para complementar a minha resposta vou enviar uma outra forma (matemárica) de obter o mesmo resultado se os campos das colunas forem numéricos.
Select * from clientes where expiradia + (32 * expirames) + (366 * expiraano) > $dia + (32 * $mes) + (366 * $ano) Espero ter ajudado!
Re: Um Pequeno Problema
Na verdade existem formas mais simples como por exemplo curdate. Isso foi um exemplo. Mas se você observar o exemplo que você deu dá na mesma. O outro também está errado.
curdate
Oq é curdate? Função do php? Eu não achei nada sobre ela ...
WHERE + HAVING ??
Queria saber se a ordem dos fatores esta correta no sql abaixo e tb queria saber se vai funcionar o select com where e having, por acaso eu terei que colcoar tudo para having ou where, o artigo acima diz que este if funcionou melhor com having ...
"select count(n.IDNoticia) as id,IF('$t_date'>=n.Data_fim,0,1) as espira from noticias as n, categoria as c, usuarios as u where n.IDCat=c.IDCat and n.IDUser=u.IDUser and n.Publicar='1' and n.Data_fim>='$t_date' and n.Indice='1' ".$sqlcat." order by n.Data_inicio DESC";
Re: WHERE + HAVING ??
Sorry, colei errado o sql:
"select count(n.IDNoticia) as id,IF(n.Data_fim<='$t_date',0,1) as expira from noticias as n, categoria as c, usuarios as u having expira='0' where n.IDCat=c.IDCat and n.IDUser=u.IDUser and n.Publicar='1' and and n.Indice='1' ".$sqlcat." order by n.Data_inicio DESC";
Re: Re: WHERE + HAVING ??
Você testou? Explica qual o resultado você deseja.
Bom artigo..
Legal o artigo..
Eu estou acostumado a usar case when () uma sintaxe um pouco diferente que é usada em bancos como o Oracle e o SQL Server.. $sql = "SELECT campo1, campo2, (CASE WHEN campo = 'Y' THEN 'S' CASE WHEN campo = 'X' THEN 'N' END) as campo3 FROM tabela_feliz";
Re: curdate
Curdate é uma função que retorna data corrente do sistema
Outra forma
Gosto de trabalhar com datas no formato Unix INT(14). Ajuda muito em comparações e em casos desse tipo.
Geralmente não é necessário usar consultas muito complexas para obter o resultado desejado.
Concatene as datas
A melhor solução é concatenar as datas ano+mes+dia, assim você terá mais facilidade para comparar e não vai condicionar a sua instrução. O próprio MySql organiza as datas desta forma.
...
O intuito do artigo é a syntax do if.
IF
Uma utilização interessante é trazer algum valor de colunas que admitem NULL.
Exemplo : SELECT nome, IF ( endereco is null, "Endereco nao preenchido", endereco) FROM enderecos ORDER BY nome
IFNULL
Cléver, acho que para esse caso seria melhor usar a função IFNULL(expr1,expr2), que retorna a expressão 1 se ela não for NULL; se for, retorna EXPR2.
Outro estrutura bem útil é o CASE, primeiro tópico da página de funções de controle de fluxo na página de ajuda do MySQL.
Usando condicionais para fazer join
Aproveitando a deixa, não sei se estou usando corretamente o espaço, mas comumente me deparo com o seguinte problema: uma tabela de clientes, com um bit indicando se é pessoa física ou jurídica; outras 2 tabelas (uma para PF outra para PJ) com os dados específicos de cada uma.
Existe alguma maneira de indicar no operador condicional, para mais de um registro no retorno, dizer para qual tabela o MySQL deve fazer o join para cada registro?
Maneira mais simples
Pega os 3 campos e concatena com CONCAT(), depois usa o comando DATE() para o mysql considerar e formatar como uma data, depois é só comparar com a data atual CURDATE().
SELECT * FROM clientes WHERE DATE( CONCAT( ano , '-' , mes , '-' , dia ) ) > CURDATE(); Isso vai retornar todos os clientes que expiram de amanhã para frente... Se quiser com mais tempo > CURDATE() + INTERVAL 1 MONTH etc...
Esse artigo é Salva Emprego.
Cara, esse artigo veio em boa hora... Queria fazer a mesma coisa que você fez.
Aqui deu tudo certo. Abraços
Buenas...
Muito menos matematico, se você tem três campos para UMA data... Por que não usar o concat na hora de comparar?
Por exemplo: select * from clinetes concat(anoexpira,'-',$mesexpira,'-',diaexpira) >= curdate() Testei no mySql 5.0, talvez em versões anteriores você precise usar o cast junto com o concat... Grande Abraço =NuNuNO== ( Que adora usar o IF em consultas, mas usa de outras formas... ) PS: É muito recomendado utilizar o tipo DATE do mySQL ao inves de trÊs campos integer...
Showwwwwwwwww
Que legal esse artigo...
Show |
|
||||||||||||||||||||||||
|
|
| João Prado Maia | ||