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 :

Comparaison des heures


Sujet :

SQL Oracle

  1. #1
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut Comparaison des heures
    Salut à tous,

    Débutante en SQL pour oracle (10 g), j’aimerai savoir comment comparer des heures en SQL.
    J’ai fais une recherche sur le Forum et trouver des réponses à ce genre de problème, mais hélas cela ne pas vraiment aider pour mon cas.

    J’ai une table avec les colonnes début (Varchar2) et fin (Varchar2).

    NR Nom debut fin
    ----------------------------------------
    1 Equipe1 06:00:00 14:29:591
    2 Equipe2 14:30:00 22:29:59
    3 Equipe3 22:30:00 06:29:00

    J’obtiens d’une requête SQL des heures. Je dois comparer chaque fois l’heure obtenu avec les heures de debut et fin pour retrouver le NR de chaque Equipe.

    Mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nr
    FROM MaTable
    where '06:30:00' BETWEEN debut AND fin
    fonctionne tout fois que l’heure entrée est soit: 06:00:00, 14:29:59, 14:30:00, 22:29:59, 22:30:00 ou 06:29:00

    Mais des que j’introduis par exemple '22:30:00' je n’obtient aucun résultat. Pourquoi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nr
    FROM MaTable
    where '22:30:00' BETWEEN debut AND fin
    Avec “IN” j’ai le même problème. Quelqu’un a-t-il une idée?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nr
    FROM MaTable
    where '23:00:00' IN (debut, fin)
    Quelqu’un a t’il une idée comment comparer des heure en SQL pour oracle?


    Merci pour vos suggestions
    Fiona

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    utilise le type DATE plutôt que VARCHAR2 et comme le jour n'a pas d'importance tu peux mettre 01/01/2000

  3. #3
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Citation Envoyé par orafrance Voir le message
    utilise le type DATE plutôt que VARCHAR2 et comme le jour n'a pas d'importance tu peux mettre 01/01/2000
    Salut orafrance,

    je crois que je ne peux pas changer la table comme je veux, ou alors ajouter une date aux colonnes debut et fin, car il ya plusieurs applications qui utlisent cette table. Et demander qu'on la change pour que je puisse resoudre mon problemm, je pense que ce n'est pas possible.

    Ou alors n'ai je pas bien compris ta proposition?

    Fiona

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    tu peux aussi faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nr
    FROM MaTable
    WHERE TO_DATE('01/01/2000 06:30:00',DD/MM/YYYY') BETWEEN TO_DATE('01/01/2000 '|| debut,DD/MM/YYYY') AND TO_DATE('01/01/2000 '|| fin,DD/MM/YYYY')
    c'est évidemment moins élégant

  5. #5
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Citation Envoyé par orafrance Voir le message
    tu peux aussi faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nr
    FROM MaTable
    WHERE TO_DATE('01/01/2000 06:30:00',DD/MM/YYYY') BETWEEN TO_DATE('01/01/2000 '|| debut,DD/MM/YYYY') AND TO_DATE('01/01/2000 '|| fin,DD/MM/YYYY')
    Salut,

    j'ai essayé ton code, mais j'ai l'erreur suivante:
    ORA-01830 date format picture ends before convertingentire input string
    Je vais essayer de voir sur google la signification.

    Fiona

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    La solution proposée ne marchera pas selon moi.

    Ton problème vient de ta ligne qui concerne l'équipe3. En fait, elle est à cheval sur 2 jours et c'est aussi pour cela que ton between ne ramène rien pour les heures entre 22:30 et 05:59.

    Peux-tu rajouter une ligne dans ta table?

    NR Nom debut fin
    ----------------------------------------
    1 Equipe1 06:00:00 14:29:59
    2 Equipe2 14:30:00 22:29:59
    3 Equipe3 22:30:00 23:59:59
    4 Equipe3 00:00:00 05:59:59

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Salut,

    Sinon tu peux passer par une pseudo vue (je sais pas bien comment ça s'appelle )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with heure as (select TO_DATE('01/01/2000 '|| debut,'DD/MM/YYYY HH24:MI:SS') as heure_debut,
                          (case when fin > debut then
                               TO_DATE('01/01/2000 '|| fin,'DD/MM/YYYY HH24:MI:SS')
                          else TO_DATE('02/01/2000 '|| fin,'DD/MM/YYYY HH24:MI:SS')
                          end) as heure_fin,
                          m.*
                    from matable m)
    select nr from heure
    where TO_DATE('01/01/2000 23:30:00','DD/MM/YYYY HH24:MI:SS') between heure_debut and heure_fin

  8. #8
    Membre confirmé Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Par défaut
    Salut à tous,

    Tout d'adord je trouve ce forum tres interessant et actif.
    Grand merci pour vos sugestions et "pistes". J'ai pu demander la permission à mon encadreur de stage et changer le type des colonnes "debut" et "fin" de Varchar2 en Date comme vous me l'avez sugeré. Ce qui m'a permis de resoudre facilement le probleme. Voilà ma solution que je propose, cela poura peut-etre aider quelqu'un d'autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT nr
    FROM MaTable
    WHERE (TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') >= debut
        and TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') <= fin
        and debut < fin)
        or
        (
            (TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') >= debut
            or TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') <= fin)
            and debut > fin
        )
    Bonne Journée
    Fiona

  9. #9
    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
    Citation Envoyé par Fiona08 Voir le message
    ...
    Voilà ma solution que je propose, cela poura peut-etre aider quelqu'un d'autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT nr
    FROM MaTable
    WHERE (TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') >= debut
        and TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') <= fin
        and debut < fin)
        or
        (
            (TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') >= debut
            or TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') <= fin)
            and debut > fin
        )
    ...
    J’adore cette histoire de debut > fin ça me fait rêver à des machines pour voyager dans les temps.

  10. #10
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Fiona08 Voir le message
    Grand merci pour vos sugestions et "pistes".
    J'ai pu demander la permission à mon encadreur de stage et changer le type des colonnes "debut" et "fin" de Varchar2 en Date comme vous me l'avez sugeré.
    Ce qui m'a permis de resoudre facilement le probleme. Voilà ma solution que je propose, cela poura peut-etre aider quelqu'un d'autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT nr
    FROM MaTable
    WHERE (TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') >= debut
        and TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') <= fin
        and debut < fin)
        or
        (
            (TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') >= debut
            or TO_DATE('30.12.1899 02:00:00', 'dd.mm.yyyy hh24:mi:ss') <= fin)
            and debut > fin
        )
    Bonne Journée
    Fiona
    Désolé, mais pour moi il n'y avait pas besoin de changer le type de tes colonnes.
    Tu aurais pu garder ton select, si tu as toujours ce format là (HH24:MI:SS)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nr
    FROM MaTable
    WHERE ('06:30:00' BETWEEN debut AND fin and debut < fin )
    OR ( debut > fin AND ('06:30:00' >= debut OR '06:30:00' <= fin))

  11. #11
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    mais d'un point de vue de la modélisation ce n'est pas correcte... le format time n'existe pas mais le format date est bien présent pour gérer les heures alors il ne faut pas s'en priver. Le varchar2 c'est le meilleur moyen d'avoir des heures du type : 32:72:63

  12. #12
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pas entièrement d'accord avec toi.
    Si ton appli gère les heures correctement, pas de problèmes.
    Au pire, tu fais un trigger qui teste si le to_date marche bien avec ce format d'heures.

    Dans le cas d'une date (comme la requête faite par Fiona), si jamais la date renseignée n'est pas au bon jour, pas de données...
    Je trouve que mettre une date en dur au 30.12.1899, c'est pas mieux que d'avoir un format horaire en varchar2.

  13. #13
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est pas moi qui est fait les lois normales de la modélisation

  14. #14
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tu sais ce qu'on dit sur les lois ?
    C'est fait pour être enfreint

  15. #15
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Tu retrouveras Codd en enfer

  16. #16
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Houla, j'ai commencé à lire, j'ai pas tenu longtemps.
    Beaucoup trop théorique pour moi.

    Bon sinon pour en revenir au problème, tu veux stocker des heures de shifting (quelque soit le jour). Première équipe de 0h à 8h30, seconde de 8h30 à 13h, etc...
    Je ne vois pas ce que les "lois normales de la modélisation" ont à faire dans la façon dont tu vas stocker ces données.

    1+ Tu peux très bien stocker sous forme de nombre en mettant le nb de minutes après 0h

    2+ Tu peux stocker en chaine de caractère au format que tu souhaites

    3+ Tu peux stocker une date (date+heure) mais la date pure n'a aucun rapport avec la donnée.


    Tu vois pour moi, stocker en format date ne viendrait qu'en 3ème position dans mes choix de type de colonne.

  17. #17
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    un nombre ou une date pourquoi pas mais surtout pas un varchar tout simplement parce que tu ne pourras pas utiliser les comparaisons ou opération sans convertir le champs... alors plutôt que faire des conversions systématiquement c'est quand même bien plus intelligent de modifier le type.

    Le seul intérêt du varchar c'est de forcer l'affichage... et le jour ou tu veux passer de HH24:MI à HH heures MI minutes, t'as plus qu'à aller te pendre

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

Discussions similaires

  1. [XL-2003] Comparaison des heures de pause théorie/pratique
    Par willou893 dans le forum Excel
    Réponses: 8
    Dernier message: 11/07/2013, 10h40
  2. Comparaison des heures
    Par Paladyn dans le forum Débuter
    Réponses: 6
    Dernier message: 24/11/2011, 15h05
  3. Comparaison des dates et heures
    Par IcedLand dans le forum Sql Developer
    Réponses: 1
    Dernier message: 21/09/2007, 10h04
  4. [CR] Additionner des heures
    Par sbis dans le forum Formules
    Réponses: 4
    Dernier message: 22/03/2004, 15h34
  5. [TIME] Gestion des heures
    Par Seb7 dans le forum Débuter
    Réponses: 2
    Dernier message: 10/07/2003, 16h28

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