Página 1 de 1

MySQL - Domingo de páscoa

Enviado: 22 Abr 2021 16:46
por JoséQuintas
Quase igual ao Harbour.

Em Harbour

Código: Selecionar todos

FUNCTION DomingoDePascoa( nAno )

   LOCAL nA, nB, nC, nD, nE, nF, nG, nH, nI, nK, nL, nM, nMes, nDia

   nA   := nAno % 19
   nB   := Int( nAno / 100 )
   nC   := nAno % 100
   nD   := Int( nB / 4 )
   nE   := nB % 4
   nF   := Int( ( nB + 8 ) / 25 )
   nG   := Int( ( nB - nF + 1 ) / 3 )
   nH   := ( 19 * nA + nB - nD - nG + 15 ) % 30
   nI   := Int( nC / 4 )
   nK   := nC % 4
   nL   := ( 32 + 2 * nE + 2 * nI - nH - nK ) % 7
   nM   := Int( ( nA + 11 * nH + 22 * nL ) / 451 )
   nMes := Int( ( nH + nL - 7 * nM + 114 ) / 31 )
   nDia := ( ( nH + nL - 7 * nM + 114 ) % 31 ) + 1

   RETURN Stod( StrZero( nAno, 4 ) + StrZero( nMes, 2 ) + StrZero( nDia, 2 ) )
Em MySQL

Código: Selecionar todos

CREATE FUNCTION ze_DomingoDePascoa( nAno INT )
RETURNS DATE
BEGIN
   DECLARE nA, nB, nC, nD, nE, nF, nG, nH, nI, nK, nL, nM, nMes, nDia INT;
   DECLARE cData DATE;

   SET nA   = Mod( nAno, 19 );
   SET nB   = floor( nAno / 100 );
   SET nC   = Mod( nAno, 100 );
   SET nD   = floor( nB / 4 );
   SET nE   = Mod( nB, 4 );
   SET nF   = floor( ( nB + 8 ) / 25 );
   SET nG   = floor( ( nB - nF + 1 ) / 3 );
   SET nH   = Mod( 19 * nA + nB - nD - nG + 15, 30 );
   SET nI   = floor( nC / 4 );
   SET nK   = Mod( nC, 4 );
   SET nL   = Mod( 32 + 2 * nE + 2 * nI - nH - nK, 7 );
   SET nM   = floor( ( nA + 11 * nH + 22 * nL ) / 451 );
   SET nMes = floor( ( nH + nL - 7 * nM + 114 ) / 31 );
   SET nDia = Mod( nH + nL - 7 * nM + 114, 31 ) + 1;
   SET cData = CONCAT( LPAD( nAno, 4, '0' ), '-', + LPAD( nMes, 2, '0' ), '-', LPAD( nDia, 2, '0' ) );

   RETURN cData;
END;
mysql.png

MySQL - Domingo de páscoa

Enviado: 22 Abr 2021 16:50
por JoséQuintas
Está aí uma coisa interessante....

Como compilo com -w3 -es2, isso obriga a declarar variáveis.
Ficou praticamente pronto pro MySQL.

Tá aí mais um bom motivo pra acostumar a compilar com -w3 -es2.
Mesmo que o Harbour permita compilar diferente, não é comum deixar de declarar variáveis.

Nota:
Parece que a minha ida e vinda de Visual Basic, depois -w3 -es2, e agora MySQL, parece que tudo se encaixou direitinho.
É como se, sem querer, eu tivesse feito um curso de programação, pra reaprender.

Ou... como o Itamar diz: é sempre bom aprender mais de uma linguagem.
A gente pode pegar o estilo de cada uma, e melhorar nossos fontes.
É olhar o que está na frente do nariz kkkk

Igual agora, quando comparei o fonte Harbour com o fonte MySQL.

MySQL - Domingo de páscoa

Enviado: 22 Abr 2021 16:58
por JoséQuintas
Também lembra um pouco a criação de classes/métodos do Harbour.

É primeiro declarar a função, e depois colocar o fonte da função.

MySQL - Domingo de páscoa

Enviado: 22 Abr 2021 17:14
por JoséQuintas
O que aprendemos neste post:

programador 1:
- MySQL é muito complicado, cheio de ponto e vírgula, muito diferente

programador 2:
- Uia... declara variáveis igual no Harbour
- Uia... declara usando DECLARE, igual no Harbour pra declarar array
- Uia... RETURN igual no Harbour
- Uia... declara a função e depois coloca rotina, igual no Harbour pra classes
- Uia... Mod() pra resto da divisão, igual no Harbour
- Só falta aprender mais alguns detalhes, parece que estou com meio caminho andado.

Uma diferença entre programador "novo" e programador "velho", é que para os novos tudo é desafio, vão em frente sempre.
Já o programador velho, enxerga só a parte ruim e/ou defeitos.

Na verdade, o programador velho tem problemas pra enxergar de perto.
Só precisa de óculos, pra voltar a enxergar o que está na frente do nariz.

De uns tempos pra cá eu tenho feito muito isso.
E sempre aproveito pra indicar alguns óculos... kkkk
Os mesmos óculos que me fizeram enxergar melhor.

MySQL - Domingo de páscoa

Enviado: 23 Abr 2021 21:34
por JoséQuintas
Terça de carnaval mais fácil, já que é baseada na anterior.

Código: Selecionar todos

CREATE FUNCTION ze_tercadecarnaval( nAno INT )
RETURNS DATE
BEGIN
   DECLARE dData DATE;

   SET dData = DATE_SUB( ze_domingodepascoa( nAno ), INTERVAL 47 DAY );

   RETURN dData;
END;