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

PL/SQL Oracle Discussion :

Gestion heure été / hiver sql oracle


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 171
    Par défaut Gestion heure été / hiver sql oracle
    Merci pour votre aide précieuse.

    j'ai trouvé ce code sur le forum et j'aimerais l'adapter au language sql oracle mais je n'y arrive pas. Des problèmes de Returns, d'@ etc...

    Voici l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Erreur(2,31): PLS-00103: Symbole "@" rencontré à la place d'un des symboles suivants :     <identificateur> <identificateur entre guillemets> current    delete exists prior
    Merci pour votre aide.

    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
    63
    64
    65
    66
    67
    68
     
    CREATE FUNCTION dbo.F_CHANGEMENT_HEURE (@AN INT)  
     
       RETURNS @T TABLE (AN SMALLINT, JOUR DATETIME, SAISON VARCHAR(5), DECALAGE_UTC SMALLINT)  
     
    AS  
     
    BEGIN  
     
    DECLARE @DD DATETIME, @AND SMALLINT, @ANF SMALLINT;  
     
    SELECT @AND = COALESCE(@AN, 1976), @ANF = COALESCE(@AN, 2100)  
     
    WHILE @AND <= @ANF  
     
    BEGIN  
     
    -- passage à l'heure d'été, le dernier dimanche de mars à 1h  
     
       SET @DD = CAST(CAST(@AND AS CHAR(4)) + '0331 00:01' AS DATETIME);  
     
       WHILE DATEPART(weekday, @DD) <> 7  
     
          SET @DD = DATEADD(day, -1, @DD);  
     
       INSERT INTO @T VALUES (@AND, @DD, 'Été', +2);        
     
       IF @AND < 1996 
     
       BEGIN 
     
       -- passage à l'heure d'été, le dernier dimanche de septembre à 1h  
     
          SET @DD = CAST(CAST(@AND AS CHAR(4)) + '0930 00:01' AS DATETIME);  
     
          WHILE DATEPART(weekday, @DD) <> 7  
     
             SET @DD = DATEADD(day, -1, @DD);  
     
          INSERT INTO @T VALUES (@AND, @DD, 'Hiver', +2);        
     
       END    
     
       ELSE 
     
       BEGIN 
     
    -- passage à l'heure d'hiver, le dernier dimanche d'octobre à 1h  
     
          SET @DD = CAST(CAST(@AND AS CHAR(4)) + '1031 00:01' AS DATETIME);  
     
          WHILE DATEPART(weekday, @DD) <> 7  
     
             SET @DD = DATEADD(day, -1, @DD);  
     
          INSERT INTO @T VALUES (@AND, @DD, 'Hiver', +1);              
     
       END    
     
       SET @AND = @AND + 1;     
     
    END     
     
    RETURN;  
     
    END     
     
    GO

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Ces noms de variables commençant par un @ me font immédiatement penser à du TSQL (Sybase, SQL Server).
    Tu vas avoir pas mal de travail pour convertir tout cela en PL/SQL.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 171
    Par défaut
    oui j'ai trouvé ici :

    http://blog.developpez.com/sqlpro/p7...nts_d#comments

    merci pour la précision mais oui j'avais remarqué le sql server c'est bien là mon problème le create procédure d'Oracle est différent dans l'expression des variables.

    une petite aide ? quelque chose existe peut-être déjà en oracle ou java, c'est pour utiliser sous Talend.

    Merci pour l'aide

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Voici aujourd'hui comment je ferais cela en 1 seule requête, plus facile à traduire :

    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
    DECLARE @AN SMALLINT = 2000;
     
    WITH 
    T_DATE_HE AS
    (SELECT DATEFROMPARTS(@AN, 3, 1) AS JOUR, DATEPART(WEEKDAY, DATEFROMPARTS(@AN, 3, 1)) AS JOUR_NUM
     UNION ALL
     SELECT DATEADD(day, 1, JOUR),  DATEPART(weekday, DATEADD(day, 1, JOUR))
     FROM   T_DATE_HE
     WHERE  MONTH(DATEADD(day, 1, JOUR))  = 3
     ),
    T_DATE_EH AS
    (SELECT DATEFROMPARTS(@AN, CASE WHEN @AN < 1996 THEN 9 ELSE 10 END, 1) AS JOUR, 
            DATEPART(weekday, DATEFROMPARTS(@AN, CASE WHEN @AN < 1996 THEN 9 ELSE 10 END, 1)) AS JOUR_NUM
     UNION ALL
     SELECT DATEADD(day, 1, JOUR),  DATEPART(weekday, DATEADD(day, 1, JOUR))
     FROM   T_DATE_EH
     WHERE  MONTH(DATEADD(day, 1, JOUR)) = CASE WHEN @AN < 1996 THEN 9 ELSE 10 END
     ),
    T_DATE AS
    (
    SELECT 'Été-Hiver' AS CHANGEMENT, *, RANK() OVER(PARTITION BY JOUR_NUM ORDER BY JOUR DESC) AS N 
    FROM   T_DATE_EH
    UNION ALL
    SELECT 'Hiver-Été' AS CHANGEMENT, *, RANK() OVER(PARTITION BY JOUR_NUM ORDER BY JOUR DESC) AS N 
    FROM   T_DATE_HE
    )
    SELECT CHANGEMENT, JOUR 
    FROM   T_DATE
    WHERE  JOUR_NUM = 7 AND N = 1
    ORDER BY JOUR;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 171
    Par défaut
    Merci pour ta réponse.

    Mais comment imbriques-tu cela dans une fonction ou procédure. je connais un peu mais je galère un max pour intégrer cela.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En PL/SQL ça donnerait ça :
    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
    create or replace type typ_changement_heure as object
    ( jour          date
    , saison        varchar2(5 char)
    , decalage_utc  varchar2(2 char)
    );
    /
    -- Elément Type TYP_CHANGEMENT_HEURE compilé
     
    create or replace type tbl_changement_heure
    as table of typ_changement_heure;
    /
    -- Elément Type TBL_CHANGEMENT_HEURE compilé
     
    create or replace function f_changement_heure (p$_annee integer)
    return tbl_changement_heure pipelined
    as
        c$_annee_dt constant date := trunc(to_date(to_char(p$_annee), 'yyyy'), 'yyyy') + interval '1' hour;
    begin
        for c$_cur in
        (
        with cte_dates (jour, saison, decalage_utc) as
        (
            select c$_annee_dt + interval '3' month - level
                 , 'Hiver'
                 , '+2'
              from dual
        connect by level <= 7
             union all
            select c$_annee_dt + interval '10' month - level
                 , 'Été'
                 , '+1'
              from dual
        connect by level <= 7
        )
        select jour, saison, decalage_utc
          from cte_dates
         where to_char(jour, 'Day', 'nls_date_language=French') = 'Dimanche'
        )
        loop
            pipe row (typ_changement_heure(c$_cur.jour, c$_cur.saison, c$_cur.decalage_utc));
        end loop;
    end;
    /
    -- Elément Function F_CHANGEMENT_HEURE compilé
     
    show errors;
    -- Aucune erreur.
    Et la récupération des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * from table(f_changement_heure(2016));
     
    JOUR                SAISON DECALAGE_UTC
    ------------------- ------ ------------
    2016-03-27 01:00:00 Hiver  +2
    2016-10-30 01:00:00 Été    +1

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 171
    Par défaut
    je comprends mieux le fonctionnement.

    tu crée un objet fictif comme une table en mode object
    a partir de cet objet tu crée ta table

    et ensuite en avant le code.

    merci beaucoup, il me reste plus qu'à faire la comparaison de date dans Talend, la mettre dans ma variable globale et le tour est joué.

    Tu m'as fais gagner un temps fou.

    merci et bonne soirée alors et bon weekend

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Plus simple, nul besoin d'un changement de contexte avec le moteur SQL
    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
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
     
    SQL> 
    SQL> create or replace function f_changement_heure2 (annee In integer)
      2  return tbl_changement_heure pipelined
      3  as
      4      cstDatEte    Date := To_Date('31/03/'||annee,'DD/MM/YYYY');
      5      cstDatHiver  Date := To_Date('31/10/'||annee,'DD/MM/YYYY');
      6  begin
      7     pipe row (typ_changement_heure(cstDatEte   - mod(To_Number(To_Char(cstDatEte,'D')),7) + 1/24, 'Été', '+2'));
      8     pipe row (typ_changement_heure(cstDatHiver - mod(To_Number(To_Char(cstDatHiver,'D')),7) + 1/24, 'Hiver', '+1'));
      9  end;
     10  /
    Function created
     
    SQL> select * from table(f_changement_heure2(2016))
      2  /
    JOUR        SAISON DECALAGE_UTC
    ----------- ------ ------------
    27/03/2016  Été    +2
    30/10/2016  Hiver  +1

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PL/SQL] Heure d'été / Heure d'hiver
    Par arnauann dans le forum SQL
    Réponses: 7
    Dernier message: 11/07/2014, 11h14
  2. [PL/SQL - Oracle 9i] CLOB et owa_pattern
    Par rebolon dans le forum Oracle
    Réponses: 9
    Dernier message: 18/11/2004, 15h28
  3. Generer du xml via SQL(oracle) avec de l'asp
    Par jpg dans le forum XQUERY/SGBD
    Réponses: 6
    Dernier message: 03/08/2004, 12h36
  4. [SQL ORACLE] Soustraction de deux timestamps
    Par platinum07 dans le forum SQL
    Réponses: 34
    Dernier message: 02/07/2004, 10h42
  5. PL/SQL ORACLE (Record Dans un Varchar2)
    Par argoet dans le forum PL/SQL
    Réponses: 24
    Dernier message: 14/05/2004, 16h06

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