Esta página tem uma maneira bastante simples de gerar uma tabela de calendário robusta. Copiei e colei abaixo:
CREATE TABLE calendar_table (
dt DATE NOT NULL PRIMARY KEY,
y SMALLINT NULL,
q tinyint NULL,
m tinyint NULL,
d tinyint NULL,
dw tinyint NULL,
monthName VARCHAR(9) NULL,
dayName VARCHAR(9) NULL,
w tinyint NULL,
isWeekday BINARY(1) NULL,
isHoliday BINARY(1) NULL,
holidayDescr VARCHAR(32) NULL,
isPayday BINARY(1) NULL
);
CREATE TABLE ints ( i tinyint );
INSERT INTO ints VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
INSERT INTO calendar_table (dt)
SELECT DATE('2010-01-01') + INTERVAL a.i*10000 + b.i*1000 + c.i*100 + d.i*10 + e.i DAY
FROM ints a JOIN ints b JOIN ints c JOIN ints d JOIN ints e
WHERE (a.i*10000 + b.i*1000 + c.i*100 + d.i*10 + e.i) <= 11322
ORDER BY 1;
Eu não entendo o que está acontecendo na última consulta. Alguém pode me explicar passo a passo?
Não sei o que você quer na explicação, mas a última parte da consulta faz um cross join (
Cartesian join
) para gerar uma sequência ordenada de números de 0 a 11322 usando a tabela de dígitos chamadaints
. A consulta então adiciona esses números à data '2010-01-01' como intervalo de dias, gerando assimetc. até adicionar 11322 dias, isto é,
'2040-12-31'
. Essas datas são inseridas nodt
campo do arquivocalendar_table
.Bem, esta é uma maneira comum de criar uma tabela de dimensão de data. Depois que as datas forem inseridas, você poderá atualizar o restante dos campos. Geralmente, você deseja criar a tabela de feriados de sua organização e uma lógica de dia de pagamento ou tabela de dia de pagamento para atualizar os campos de feriado e dia de pagamento. O restante dos campos pode ser atualizado com uma consulta com funções de data conforme abaixo.
Felicidades.