IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Calendrier avec jours fériés


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut Calendrier avec jours fériés
    Citation Envoyé par Waldar Voir le message
    Table 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
    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;
    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
    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);
    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
    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;
    Bonjour,

    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...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    J'ai réussi à créer les 2 tables mais je n'arrive pas à alimenter ma table calendrier, j'ai essayé:

    DECLARE
    @startdate DATE = DATEFROMPARTS(2012, 1, 1),
    @enddate DATE = DATEFROMPARTS(2012, 12, 31);
    WHILE @startdate <= @enddate
    BEGIN
    INSERT INTO calendrier (cal_jour)
    VALUES (@startdate);
    SET @startdate = DATEADD(DAY, 1, @startdate);
    END;

    Mais j'ai les messages d'erreur:
    line 1, col 1: Incorrect syntax near 'declare'
    line 4, col 1: Incorrect syntax near 'while'
    line 9, col 1: Incorrect syntax near 'end'

Discussions similaires

  1. [11g] Calendrier avec jours fériés
    Par Waldar dans le forum Contribuez
    Réponses: 3
    Dernier message: 20/06/2014, 14h04
  2. Réponses: 3
    Dernier message: 13/10/2011, 13h28
  3. Calendrier avec jours dans listview
    Par Susp3nded dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 20/06/2011, 13h46
  4. [SP-2007] Calendrier et jours fériés
    Par ORetLIE dans le forum SharePoint
    Réponses: 2
    Dernier message: 21/09/2010, 15h42
  5. Opérations avec Jours Fériés
    Par XGotX dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/08/2007, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo