Knot Posted September 28, 2012 at 12:21 PM Report #476905 Posted September 28, 2012 at 12:21 PM (edited) Boas! Estou a fazer uma pesquisa e não consigo ordenar a data por dia e mês, apenas ordena pelo dia... A consulta é a seguinte: select cast(date_format(data, '%d-%m-%Y')as char(10)) as Data, cast(time_format(hora,'%H:%i')as char(5)) as Hora, equipas as Jogo, campeonato.descricao as Competição, canal as Canal from jogo inner join campeonato on jogo.campeonato = campeonato.chavec where Data between cast(date_format(sysdate(), '%Y-%m-%d')as char(10)) and DATE_ADD(sysdate(), INTERVAL 7 DAY) order by Data, Hora LIMIT 15 Tenho a tabela jogos com os seguintes campos: chave - int equipas - varchar campeonato - int data - date hora - time canal - varchar Tenho a tabela campeonato com os seguintes campos: chave - int descricao - varchar O outupt está aqui: http://www.tvdospobres.com/jogos.php Edited October 9, 2012 at 11:59 AM by brunoais geshi
KTachyon Posted September 28, 2012 at 12:33 PM Report #476907 Posted September 28, 2012 at 12:33 PM Epah, estás a fazer um cast, a ordem fica alfabética em vez de por data. Em vez de fazeres order by Data, Hora, utilizas a coluna que tem a data (timestamp), que creio que seja a data. Mas sugiro que alteres os nomes, porque algumas instalações do MySQL podem ser case insensitive, logo 'Data' e 'data' podem gerar problemas. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
mjamado Posted September 28, 2012 at 12:34 PM Report #476908 Posted September 28, 2012 at 12:34 PM Se estás a fazer o cast da data para caracteres, a ordenação é feita alfabeticamente. Logo, a string "10-10-2010" vem depois de "09-10-2012". Não usar casts explícitos no SQL, a menos que tenhas uma razão muito forte - e, do que é dado a ver, aqui não há nenhuma. "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
Knot Posted September 28, 2012 at 01:23 PM Author Report #476915 Posted September 28, 2012 at 01:23 PM A razão de usar o cast é porque o formato date guarda a data no formato ano-mês-dia e no resultado final eu quero que seja mostrado no formato dia-mes-ano. Também no caso do formato time ele guarda por exemplo 23:15:00 e eu quero apenas mostrar 23:15. A questão de usar data ou Data é indiferente pq a partir do momento que eu coloco "data as Data" tanto um como outro passam a ser a mesma coisa. Mas se poderem dar uma ajuda agradeço, às vezes pensamos de um modo errado e não conseguimos que saia bem...
KTachyon Posted September 28, 2012 at 01:50 PM Report #476921 Posted September 28, 2012 at 01:50 PM No teu caso passa a ser a mesma coisa. Outras instalações podem estar configuradas para ser case sensitive. A solução é simples, e já a indiquei, mas se calhar não fui suficientemente óbvio: select cast(date_format(data, '%d-%m-%Y')as char(10)) as Data_STR, cast(time_format(hora,'%H:%i')as char(5)) as Hora, equipas as Jogo, campeonato.descricao as Competição, canal as Canal from jogo inner join campeonato on jogo.campeonato = campeonato.chavec where data between sysdate() and DATE_ADD(sysdate(), INTERVAL 7 DAY) order by data, Hora LIMIT 15 “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Knot Posted September 28, 2012 at 02:25 PM Author Report #476927 Posted September 28, 2012 at 02:25 PM (edited) Já tinha tentado antes meter order by data e o resultado de output era o mesmo, e tinhas razão na questão do Data/data, pois metendo agora Data_STR já deu diferente e correto. Meti como indicaste, mas tive de deixar na mesma o cast em : where Data between cast(date_format(sysdate(), '%Y-%m-%d')as char(10)) and DATE_ADD(sysdate(), INTERVAL 7 DAY) Caso não coloque aqui o cast não me mostra o dia atual, só mostra os dados relativos aos 7 dias seguintes sem mostrar o atual, pois penso que o resultado do sysdate() dá data completa e eu estou apenas a inserir datas "simples". Já está a funcionar! Se houver alguma maneira mais optimitzada agradeço que partilhem, é sempre bom aprender mais um pouco! Edited September 28, 2012 at 02:27 PM by Knot
mjamado Posted September 28, 2012 at 03:00 PM Report #476931 Posted September 28, 2012 at 03:00 PM De qualquer forma, evita usar esses casts. Eu percebo a motivação de usar, mas a responsabilidade de apresentação nunca é do modelo (ou da SGBD subjacente ao modelo) e sim das vistas (ou dos controladores, também há quem defenda). Uma data deve ser representada internamente por timestamp ou no formato ISO correspondente (não me lembro agora do número); depois, deve ser apresentada (numa vista, lá está) no formato do locale pretendido. "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
KTachyon Posted September 28, 2012 at 03:48 PM Report #476942 Posted September 28, 2012 at 03:48 PM (edited) Em principio o problema de "teres que fazer cast do sysdate()" é porque ele te dá a data e a hora. Resolves isso com: date(sysdate()) Não precisas de fazer o format+cast do sysdate(). EDIT: De facto até podes utilizar simplesmente o: CURDATE() Edited September 28, 2012 at 03:49 PM by KTachyon “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
Knot Posted September 28, 2012 at 05:17 PM Author Report #476961 Posted September 28, 2012 at 05:17 PM Sim o problema é mesmo porque me dava data e hora, testei com o curdate() e funciona bem! Vou também tentar colocar isto como vista assim que tenha um tempito. Obrigado aos dois!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now