SQL COMPLICADA

FBUR 04/07/2016 14:45:13
#464468
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.
KERPLUNK 04/07/2016 17:28:27
#464470
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.
FBUR 04/07/2016 17:39:38
#464473
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.
Tópico encerrado , respostas não são mais permitidas