SQL COMPLICADA
Boa tarde!
Os campos de data do meu banco estão no formato [Ô]yyyymm[Ô] e são do tipo string. é uma SQL (MySQL) muito grande e complexa. Por isso estou fazendo uns testes antes de colocar no código. Estou usando o MySQL Query Browser.
Mas resumindo, preciso pegar um perÃodo. Então uso o WHERE BETWEEN [ô]DataInicial[ô] AND [ô]DataFinal[ô]. Mesmo com a data com tipo string dá para o BETWEEN graças ao format [Ô]yyyymm[Ô]. O problema é que preciso fazer assim:
WHERE BETWEEN DataInicial -1 AND [ô]DataFinal[ô]
Ou seja, preciso pegar um mês antes. E infelizmente esta data inicial é dinâmica, gerada conforme a SQL roda. Assim:
... WHERE tbl_selic.dt_comp BETWEEN k300.dt_comp AND [ô]201604[ô].....
Esta k300 é uma tabela do meu banco. E dt_comp é a competência inicial e, claro, 201604 a competência final. O problema é que preciso do mês anterior na competência incial. Se eu fizer assim:
... WHERE tbl_selic.dt_comp BETWEEN k300.dt_comp -1 AND [ô]201604[ô].....
Até dá certo, mas só até antes de virar para o ano anterior, pois: 201601 - 1 = 201600 e isso nó écziste :(
Eu sei que tenho como alterar este campo do tipo String para o tipo Data. Mas agora não dá. Tenho que trabalhar com o tipo String mesmo.
No código fonte do VB é moleza. Mas, como eu disse, estou fazendo uns testes via MySQL Query Browser.
Será que dá?
Abs.
Os campos de data do meu banco estão no formato [Ô]yyyymm[Ô] e são do tipo string. é uma SQL (MySQL) muito grande e complexa. Por isso estou fazendo uns testes antes de colocar no código. Estou usando o MySQL Query Browser.
Mas resumindo, preciso pegar um perÃodo. Então uso o WHERE BETWEEN [ô]DataInicial[ô] AND [ô]DataFinal[ô]. Mesmo com a data com tipo string dá para o BETWEEN graças ao format [Ô]yyyymm[Ô]. O problema é que preciso fazer assim:
WHERE BETWEEN DataInicial -1 AND [ô]DataFinal[ô]
Ou seja, preciso pegar um mês antes. E infelizmente esta data inicial é dinâmica, gerada conforme a SQL roda. Assim:
... WHERE tbl_selic.dt_comp BETWEEN k300.dt_comp AND [ô]201604[ô].....
Esta k300 é uma tabela do meu banco. E dt_comp é a competência inicial e, claro, 201604 a competência final. O problema é que preciso do mês anterior na competência incial. Se eu fizer assim:
... WHERE tbl_selic.dt_comp BETWEEN k300.dt_comp -1 AND [ô]201604[ô].....
Até dá certo, mas só até antes de virar para o ano anterior, pois: 201601 - 1 = 201600 e isso nó écziste :(
Eu sei que tenho como alterar este campo do tipo String para o tipo Data. Mas agora não dá. Tenho que trabalhar com o tipo String mesmo.
No código fonte do VB é moleza. Mas, como eu disse, estou fazendo uns testes via MySQL Query Browser.
Será que dá?
Abs.
Primeiro, você não tem campos data, você tem campos string e por não usar a tipagem correta está tendo problemas que serão bem difÃceis de serem contornados. A melhor alternativa seria criar campos data de verdade, mas acho que isso você não vai querer fazer. Então é a saÃda é converter na query dinamicamente os campos para formato data.
O que eu quis dizer é que as competências significam um perÃodo, representam uma data. E não deixam de representar por que estão armazenadas como string. Claro, tecnicamente não são. Mas é isso mesmo. Meus campos não são Data. São String com uma competência dentro.
Eu não posso convertê-las para o tipo Data porque existem competências com o 13º mês. Ex: 201513.
Por isso mantive o tipo data mas alterei para, ex: 2015-04-01, 2015-13-01, etc. Como para as competências o que importa é o mês e o ano, então não importa o dia. Mas como todos os meses tem o dia 01, então foi a melhor escolha. E também como por serem strings, o 13º mês pode ser inserido.
AÃ ficou fácil. Usei o date_add e consegui fazer o que precisava.
Abs.
Eu não posso convertê-las para o tipo Data porque existem competências com o 13º mês. Ex: 201513.
Por isso mantive o tipo data mas alterei para, ex: 2015-04-01, 2015-13-01, etc. Como para as competências o que importa é o mês e o ano, então não importa o dia. Mas como todos os meses tem o dia 01, então foi a melhor escolha. E também como por serem strings, o 13º mês pode ser inserido.
AÃ ficou fácil. Usei o date_add e consegui fazer o que precisava.
Abs.
Tópico encerrado , respostas não são mais permitidas