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

SQL Oracle Discussion :

Champ type heure


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 241
    Points : 118
    Points
    118
    Par défaut Champ type heure
    Bonjour

    Je cherche à créer une colonne dans une table sous oracle 10G de type time pour n'enreistrer que l'heure (ce type existe sous mysql). Apparemment il n'est pas reconnu sous oracle. Quel type de données puis-je choisir pour enregistrer juste une heure (sans date) ?

    Merci.

  2. #2
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Personnellement, j'éviterais de créer un champ time, le champ date est parfait comme il est.
    Je travaille actuellement pour un client qui possède un champ number(4) qui simule le time, et bien, tout leur code SQL, Forms ou PL est une ignominie dès qu'il fallait comparer des heures entre elles (et aussi les dates + les heures)

    A part des désavantages, je ne vois pas ce qu'on peut tirer d'un champ time, tu ne peux pas faire un index rapide unique, si tu veux faire 18h00 - 14h00, et bien, il faut réinventer la roue.

    Donc, si tu veux un conseil, le champ DATE oui, le pseudo champ TIME NON!!!

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 241
    Points : 118
    Points
    118
    Par défaut
    Merci pour ton conseil, mais au niveau de ton champ date tu peux spécifier les valeurs que tu désires réellement ?

  4. #4
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Il existe un très grand nombre de fonction pour la manipulation des dates, je ne peux pas te dire laquelle utiliser car cela dépend vraiment de tes besoins, par contre, je peux te donner un lien sur la doc : http://download.oracle.com/docs/cd/B...001.htm#i88891

    Tu devrais trouver de quoi t'aider

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Un champ texte ou un nombre peut suffire aussi (HHmm).
    Exemple :
    735 (ou 0735 en texte) (07h35) est compris entre 123 (01h23) et 1324 (13h24)
    pour 1324 - 735 il faut faire un petit calcul pas très compliqué.

    Ou 2 champs texte/numérique, un pour les heures, l'autre pour les minutes.
    Christophe

    Pensez à mettre quand c'est le cas.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Christophe P. Voir le message
    Un champ texte ou un nombre peut suffire aussi (HHmm).
    Exemple :
    735 (ou 0735 en texte) (07h35) est compris entre 123 (01h23) et 1324 (13h24)
    pour 1324 - 735 il faut faire un petit calcul pas très compliqué.

    Ou 2 champs texte/numérique, un pour les heures, l'autre pour les minutes.
    Pourquoi réinventer la roue et ne pas utiliser les multiples fonctionnalités par défaut qui marchent très bien ???
    Sans parler des performances des champs textes vs des champs date...
    Je ne comprends pas la réticence qui semble exister avec le type date. Une mauvaise connaissance des fonctionnalités ? L'affichage de l'heure pas visible par défaut ?
    Reste que pour moi, c'est une très mauvaise idée de se priver des champs date. Surtout pour gérer des dates ou heures....

  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
    Citation Envoyé par CoeurDeSQL Voir le message
    Bonjour

    Je cherche à créer une colonne dans une table sous oracle 10G de type time pour n'enreistrer que l'heure (ce type existe sous mysql). Apparemment il n'est pas reconnu sous oracle. Quel type de données puis-je choisir pour enregistrer juste une heure (sans date) ?

    Merci.
    Le type INTERVAL DAY TO SECOND est fait pour ça !
    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

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    le champs TIME n'est pas supporté dans Oracle. Il faut donc employé le champs DATE, tu peux fixer que la partie DD/MM/YYYY soit toujours égale à 01/01/2000 par exemple.

    mais tu ne peux pas stocké de champs TIME dans une table 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
     
    SQL> create view v as select time '12:00:00' t from dual;
     
    View created.
     
    SQL> desc v
     Name                          Null?    Type
     ----------------------------- -------- --------------------
     T                                      TIME(9)
     
    SQL> create table t as select time '12:00:00' t from dual;
    create table t as select time '12:00:00' t from dual
    *
    ERROR at line 1:
    ORA-00902: invalid datatype

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    tu peux avoir un trigger qui enlève la partie date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table t(d date);
    create or replace trigger tr
      before insert or update on t for each row 
    begin :new.d:=date '2000-01-01'+(:new.d-trunc(:new.d)); end;
    /
    test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> insert into t values (sysdate);
     
    1 row created.
     
    SQL> select * from t;
    D
    -------------------
    01.01.2000 14:16:52
    ou, si possible, tu crées une contrainte et tu inséres des heures pour 2000-01-01 uniquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table t(
      d date check (d>=date '2000-01-01' and d<date '2000-01-02'));

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Le type INTERVAL DAY TO SECOND est fait pour ça !
    pas d'ac

    le champs interval est fait pour stocker des durées.

    le champs time ne stocke que des heures entre 00:00:00 et 23:59:59.999999999

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 241
    Points : 118
    Points
    118
    Par défaut
    Merci pour toutes vos réponses, je vais tester tout ça.

  12. #12
    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 laurentschneider Voir le message
    pas d'ac

    le champs interval est fait pour stocker des durées.
    Justement !
    14H00 par exemple. On peut le considérer aussi bien comme une durée que comme un point dans le temps.
    Ce qui va être décisif, c'est la sémantique de la donnée, et les opérations que l'on veut être capable de faire dessus.
    Je ne vois rien dans le "cahier des charges" qui disqualifie la vision intervallaire...
    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

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    que interval soit utilisable, oui, on peut aussi utiliser number (en secondes depuis 00:00) dans ce cas, ou même varchar2 et pourquoi pas clob ou xmltype pendant qu'on y est

    si tu as une variable h='12:34.56', comment tu l'inséres dans ton interval ? avec to_dsinterval('0 '||replace(:h,'.',':')) ?
    Et après pour l'afficher?
    extract(hour from i)||':'||extract(minute from i)||'.'||extract(second from i)
    ?

    Non, interval n'est pas fait pour insérer des heures de la journée entre 00:00 et 23:59.

  14. #14
    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 laurentschneider Voir le message
    si tu as une variable h='12:34.56', comment tu l'inséres dans ton interval ? avec to_dsinterval('0 '||replace(:h,'.',':')) ?
    Et après pour l'afficher?
    extract(hour from i)||':'||extract(minute from i)||'.'||extract(second from i)
    ?

    Non, interval n'est pas fait pour insérer des heures de la journée entre 00:00 et 23:59.
    Il est certain que les intervalles sont nativement malcommodes à manipuler. Cela dit, on se fait une fonction de formatage, et la chose est réglée.

    Mais comme je disais précédemment "Ce qui va être décisif, c'est la sémantique de la donnée, et les opérations que l'on veut être capable de faire dessus."
    Que veut-on faire avec ces "heures" ? Les afficher et rien de plus ? Dans ce cas, 100% d'accord, aucune raison de se compliquer la vie avec des intervalles.
    Mais si ces heures représentent des durées de traitement (ce qui ne m'a pas semblé exclu à la lecture de la question), et qu'on veuille les additionner, alors les intervalles sont bien le type adapté.
    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

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    si ces heures représentent des durées de traitement ... alors les intervalles sont bien le type adapté.


    étrangement, les fonctions SUM et AVG ne fonctionnent pas alors que MEDIAN fonctionne parfaitement.
    De même pour ROUND et TRUNC.

    Quant à to_char, c'est sans effet...

Discussions similaires

  1. [WD10] Champs saisie type heure : comment dépasser 24h ?
    Par lepirate dans le forum WinDev
    Réponses: 7
    Dernier message: 15/02/2011, 13h51
  2. Réponses: 1
    Dernier message: 13/09/2010, 15h11
  3. Comment Enregistrer un champ type BLOB avec Query ???
    Par baba dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/01/2005, 20h33
  4. [access] champs type text sur un pc blob sur un autre
    Par Harry dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/07/2004, 09h30
  5. Type heure
    Par Mystic eyes dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/06/2004, 14h36

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