Jump to content

[Resolvido] Data apenas ordena por dia e não por dia e mês.


Recommended Posts

Posted (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 by brunoais
geshi
Posted

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

Posted

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.

Posted

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

Posted

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

Posted (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 by Knot
Posted

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.

Posted (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 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

Posted

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!

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.