Bonjour,Table des fêtes
Table calendrier
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 alter session set nls_date_language = 'French'; alter session set nls_territory = 'FRANCE'; create table calendrier_fetes ( clf_jour_fetes number(5) not null , clf_description varchar2(50) not null , clf_fixe varchar2(5) null , clf_chome number(1) not null , constraint pk_calendrier_fetes primary key (clf_jour_fetes) using index , constraint ck_calendrier_fetes_chome check (clf_chome in (0, 1)) , constraint ck_calendrier_fetes_fixe -- Vérification du format fixe "mm-dd" check (to_date('1900-' || coalesce(clf_fixe, '01-01'), 'yyyy-mm-dd') >= date '1900-01-01') ); create sequence seq_calendrier_fetes; create trigger tbi_calendrier_fetes before insert on calendrier_fetes for each row declare begin :new.clf_jour_fetes := seq_calendrier_fetes.nextval; end; / insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Jour de l''an' , '01-01', 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Épiphanie' , '01-06', 0); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Chandeleur' , '02-02', 0); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Saint-Valentin' , '02-14', 0); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Mardi Gras' , null , 0); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Mercredi des cendres', null , 0); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Vendredi Saint' , null , 0); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Pâques' , null , 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Lundi de Pâques' , null , 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Ascension' , null , 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Pentecôte' , null , 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Lundi de Pentecôte' , null , 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Fête du Travail' , '05-01', 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Fête de la Victoire' , '05-08', 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Fête Nationale' , '07-14', 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Assomption' , '08-15', 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Toussaint' , '11-01', 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Fête des Morts' , '11-02', 0); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Armistice de 1918' , '11-11', 1); insert into calendrier_fetes (clf_description, clf_fixe, clf_chome) values ('Noël' , '12-25', 1); commit;
Mise à jour des fêtes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 create table calendrier ( cal_jour date not null , cal_position_semaine as (to_char(cal_jour, 'd')) not null , cal_position_mois as (to_char(cal_jour, 'dd')) not null , cal_position_annee as (to_char(cal_jour, 'ddd')) not null , cal_semaine_iso as (to_char(cal_jour, 'iyyy"W"iw')) not null , cal_mois as (to_char(cal_jour, 'yyyy-mm')) not null , cal_trimestre as (to_char(cal_jour, 'yyyy"Q"q')) not null , cal_annee as (to_char(cal_jour, 'yyyy')) not null -- je n'ai pas mis toutes les combinaisons possibles, à adapter selon vos besoins , clf_jour_fetes number(5) null , constraint pk_calendrier primary key (cal_jour) using index ) compress; insert /*+ append */ into calendrier (cal_jour) select level - 1 + date '1900-01-01' from dual connect by level <= date '2100-01-01' - date '1900-01-01'; commit; alter table calendrier add constraint fk_calendrier_fetes foreign key (clf_jour_fetes) references calendrier_fetes (clf_jour_fetes); create index fk_calendrier_fetes on calendrier (clf_jour_fetes); create bitmap index ib_calendrier_position_semaine on calendrier (cal_position_semaine); create bitmap index ib_calendrier_position_mois on calendrier (cal_position_mois); create bitmap index ib_calendrier_position_annee on calendrier (cal_position_annee); create bitmap index ib_calendrier_semaine_iso on calendrier (cal_semaine_iso); create bitmap index ib_calendrier_mois on calendrier (cal_mois); create bitmap index ib_calendrier_trimestre on calendrier (cal_trimestre); create bitmap index ib_calendrier_annee on calendrier (cal_annee);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 -- Fêtes fixes merge into calendrier cal using calendrier_fetes clf on (to_char(cal.cal_jour, 'mm-dd') = clf.clf_fixe) when matched then update set cal.clf_jour_fetes = clf.clf_jour_fetes where cal.clf_jour_fetes is null; commit; -- Fêtes mobiles merge into calendrier cal using (with sr1 as ( select distinct cal_annee from calendrier ) , sr2 as ( select to_date(to_char(cal_annee) || '0301', 'yyyymmdd') + 27 + floor((floor(mod(19*mod(cal_annee, 19) + floor(cal_annee/100) - floor(floor(cal_annee/100)/4) - floor((8*floor(cal_annee/100) + 13) / 25) + 15, 30)/28)*floor(29/(mod(19*mod(cal_annee, 19) + floor(cal_annee/100) - floor(floor(cal_annee/100)/4) - floor((8*floor(cal_annee/100) + 13) / 25) + 15, 30)+1))*floor((21-mod(cal_annee, 19))/11)) - 1*floor(mod(19*mod(cal_annee, 19) + floor(cal_annee/100) - floor(floor(cal_annee/100)/4) - floor((8*floor(cal_annee/100) + 13) / 25) + 15, 30)/28) +mod(19*mod(cal_annee, 19) + floor(cal_annee/100) - floor(floor(cal_annee/100)/4) - floor((8*floor(cal_annee/100) + 13) / 25) + 15, 30)) - floor(mod(floor(cal_annee/4 + cal_annee)+floor((floor(mod(19*mod(cal_annee, 19) + floor(cal_annee/100) - floor(floor(cal_annee/100)/4) - floor((8*floor(cal_annee/100) + 13) / 25) + 15, 30)/28)* floor(29/(mod(19*mod(cal_annee, 19) + floor(cal_annee/100) - floor(floor(cal_annee/100)/4) - floor((8*floor(cal_annee/100) + 13) / 25) + 15, 30)+1))*floor((21-mod(cal_annee, 19))/11))- 1*floor(mod(19*mod(cal_annee, 19) + floor(cal_annee/100) - floor(floor(cal_annee/100)/4) - floor((8*floor(cal_annee/100) + 13) / 25) + 15, 30)/28) + mod(19*mod(cal_annee, 19) + floor(cal_annee/100) - floor(floor(cal_annee/100)/4) - floor((8*floor(cal_annee/100) + 13) / 25) + 15, 30) )+2+floor(floor(cal_annee/100)/4)-floor(cal_annee/100), 7)) as dt -- C'est la version monoligne de l'algo de Claus Tøndering from sr1 ) , sr3 as ( select 'Pâques' as description, dt from sr2 union all select 'Lundi de Pâques' , dt + 1 from sr2 union all select 'Ascension' , dt + 39 from sr2 union all select 'Pentecôte' , dt + 49 from sr2 union all select 'Lundi de Pentecôte' , dt + 50 from sr2 union all select 'Vendredi Saint' , dt - 2 from sr2 union all select 'Mardi Gras' , dt - 47 from sr2 union all select 'Mercredi des cendres' , dt - 46 from sr2 ) select clf.clf_jour_fetes , sr3.dt from sr3 inner join calendrier_fetes clf on clf.clf_description = sr3.description ) clv on (clv.dt = cal.cal_jour) when matched then update set cal.clf_jour_fetes = clv.clf_jour_fetes where cal.clf_jour_fetes is null; commit;
C'est exactement ce qu'il me faudrait mais en MySQL. Est ce que quelqu'un saurait l'adapter? J'ai essayé mais je n'y parviens pas. Je débute en MySql...
Partager