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

Développement SQL Server Discussion :

Format interne du type DATE


Sujet :

Développement SQL Server

  1. #1
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut Format interne du type DATE
    Bonjour à tous

    Je dispose d'un fichier de données issues de SQL Server, sous forme d'instructions INSERT, que je veux intégrer dans une base Oracle.
    Mais je bute sur les dates, qui figurent sous la forme suivante dans mes données sources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAST(0x5EC00A00 AS Date)
    Comment une valeur hexa telle que 5EC00A00 s'interprète-t-elle pour fournir une date ?
    (J'ai bien trouvé des pistes en cherchant sur internet, mais cela concernait le type DATETIME, et non DATE.)

    Je précise enfin que je veux exploiter ces données telles quelles ; il n'est pas question d'installer un SQL Server pour faire des manipulations complémentaires.


    Merci pour votre aide !

    Pom'


    Edit :
    Pour info, voici où j'ai trouvé des infos concernant la conversion vers Oracle d'un type DATETIME exprimé en hexa : https://community.oracle.com/message/10067543
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    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 : 21 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    Ce format de données est propre à SQL Server pour faire des rétro-insertion sur l'encodage binaire...
    Il faudrait d'abord savoir de quel type exact de données provient-il :
    1) DATETIME
    2) DATETIME2
    3) DATE
    (apparemment DATE)
    Qui correspond au niveau date au 1930-02-24.

    Maintenant le codage interne...

    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/ * * * * *

  3. #3
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Il faudrait d'abord savoir de quel type exact de données...
    Ben ça tombe bien, les données viennent de chez toi !! (Base sports).

    Et oui, c'est justement le codage interne qui m'intéresse, sinon je ne peux rien faire de fiable avec ces dates.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Et oui, c'est justement le codage interne qui m'intéresse, sinon je ne peux rien faire de fiable avec ces dates.
    C'est le nombre de jours en hexa depuis le 0001-01-01
    Sous Oracle :
    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
     
    WITH Tmp AS (
      SELECT CAST((to_number('5EC00A00', 'xxxxxxxx')/256) AS INT) AS i
      FROM DUAL
     )
    SELECT 
      TO_DATE('0001-01-01', 'YYYY-MM-DD') 
       +
     
       ( FLOOR(i/65536)
       + MOD(i,65536)
       + MOD(i,256)*65535
       + 2
       ) 
    FROM Tmp
    February, 24 1930
    Notez le +2 : à l'inverse de SQL Server, Oracle considère qu'il y a eu un 29 février 100, et un 29 février 200...

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Grand merci et chapeau bas, je ne l'aurais pas inventée celle-là !
    C'est quand même plus subtil que simplement "le nombre de jours en hexa depuis le 0001-01-01".

    Déjà, pourquoi cette division initiale par 256 ?
    Et je ne vois pas comment le +2 permet de tenir compte, de manière générique, des fausses années bissextiles séculaires...
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Pour la division par 256, en fait SQL serveur code la date sur trois octets. Bizarrement lors d'export, il y en à 4, le dernier étant toujours à 0. La division par 256 en amont permet donc artificiellement de supprimer le dernier octet, qui est en fait de poids le plus fort...

    Pour le +2, effectivement le résultat sera faux pour les dates antérieures au 1er mars 0200.
    Pour être exhaustif, il faudrait donc plutôt quelque chose comme :

    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
     
    WITH Tmp AS (
      SELECT CAST((to_number('5EC00A00', 'xxxxxxxx')/256) AS INT) AS i
      FROM DUAL
     )
    SELECT 
      TO_DATE('0001-01-01', 'YYYY-MM-DD') 
       +
     
       ( FLOOR(i/65536)
       + MOD(i,65536)
       + MOD(i,256)*65535
       + CASE 
            WHEN 
                (FLOOR(i/65536)
               + MOD(i,65536)
               + MOD(i,256)*65535) > 72741 THEN 2
            WHEN 
                (FLOOR(i/65536)
               + MOD(i,65536)
               + MOD(i,256)*65535) > 36217 THEN 1
             ELSE 0 
          END
       ) 
    FROM Tmp

    Que l'on pourrait aussi factoriser avec une CTE afin que cela soit plus lisible :
    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
     
    WITH Tmp AS (
      SELECT CAST((to_number('5EC00A00', 'xxxxxxxx')/256) AS INT) AS i
      FROM DUAL
     ),
    Tmp2 AS (
      SELECT 
        ( FLOOR(i/65536)
         + MOD(i,65536)
         + MOD(i,256)*65535
         ) AS DaysToAdd
      FROM tmp
      )
    SELECT 
      TO_DATE('0001-01-01', 'YYYY-MM-DD') 
       + DaysToAdd
       + CASE 
           WHEN DaysToADD > 72741 THEN 2
           WHEN DaysToADD > 36217  THEN 1
          ELSE 0
        END
    FROM Tmp2
    ;

  7. #7
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Comme mes dates ne remontent pas aux dinosaures, la première formule était donc déjà bonne, et j'ai pu intégrer mes données sous Oracle.


    Encore merci !!
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

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

Discussions similaires

  1. [DatagridView] Comment formater un type Integer en type Date ?
    Par l0quito dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2008, 08h30
  2. [MySQL] format du type date
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/04/2008, 14h16
  3. gerer le format de type date
    Par debutantasp dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/03/2008, 19h21
  4. format type date
    Par DIDIDIDA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/02/2008, 16h56
  5. format saisie de champs type DATE
    Par dohamsg dans le forum Firebird
    Réponses: 1
    Dernier message: 31/08/2007, 09h59

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