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 :

CASE WHEN avec heure supérieure à minuit


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Inscrit en
    avril 2007
    Messages
    1 211
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 1 211
    Points : 205
    Points
    205
    Par défaut CASE WHEN avec heure supérieure à minuit
    Bonjour

    J'ai une requête qui contient plusieurs champs dont l'un intitulé "journée" contient une date du type jj/mm/aaaa et un autre champ intitulé heure contient une heure de type hh:mm:ss

    J'ai crée un champ supplémentaire intitulé "vacation" avec plusieurs conditions:

    si la journee est comprise entre LUNDI et VENDREDI et que l heure est comprise 05:00 et 12:30 alors 'MATIN'
    si la journee est comprise entre LUNDI et VENDREDI et que l heure est comprise entre 12:30 et 20:00 alors 'APRES-MIDI'
    si la journee est comprise entre LUNDI et VENDREDI et que l heure est comprise entre 20:00 et 05:00 le lendemain alors 'NUIT'
    si la date est SAMEDI et que l heure est comprise entre 05:00 et 13:00 alors 'MATIN'
    si la date est SAMEDI et que l heure est comprise entre 13:00 et 23:59 alors 'APRES-MIDI'


    Voila ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case 
    when journee in('lundi','mardi','mercredi','jeudi','vendredi') and heure between '05:00' and '12:30' then 'MATIN' 
    when  journee in('lundi','mardi','mercredi','jeudi','vendredi') and heure between '12:30' and '20:00' then 'APRES-MIDI'
    when  journee in('lundi','mardi','mercredi','jeudi','vendredi') and heure between '20:00' and '05:00' then 'NUIT' 
    when  journee in('samedi') and heure between '05:00' and '13:00' then 'MATIN'
    when  journee in('samedi') and heure between '13:00' and '23:59' then 'APRES-MIDI' else 'autres' end as vacation
    Mai j'ai un soucis sur la ligne de code nuit
    Lorsque l'heure est comprise entre '20:00 et 05:00' la ligne de code n'affiche pas "nuit" mais 'autre'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    when  journee in('lundi','mardi','mercredi','jeudi','vendredi') and heure between '20:00' and '05:00' then 'NUIT'
    .
    j'ai constaté que lorsque l'heure est comprise entre '20:00' et '23:59' la ligne de code ci dessus m'affiche bien 'NUIT' mais lorsque l'heure est comprise entre '00:00' et '05:00' cela ne fonctionne plus et cela m'affiche 'autre'

    Merci d'avance

  2. #2
    Membre actif
    Inscrit en
    avril 2007
    Messages
    1 211
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 1 211
    Points : 205
    Points
    205
    Par défaut
    Bon j'ai trouvé le moyen de contourner le problème
    Sur la ligne de code 'NUIT', J'ai scinder la tranche horaire between '20:00' and '05:00' en deux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    when  journee in('lundi','mardi','mercredi','jeudi','vendredi') and heure between '20:00' and '23:59:59'  or  heure between '00:00:0' and '05:00:00'  then 'NUIT'
    et cela fonctionne

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    mai 2002
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 055
    Points : 30 678
    Points
    30 678
    Par défaut
    Bonjour,

    Telle qu'est écrite cette condition, cela signifie que la tranche horaire 'NUIT' s'applique tous les jours de la semaine pour la période entre 00h00 et 05h00.
    Est-ce bien ce que tu souhaites ?
    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.

  4. #4
    Membre éclairé Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    septembre 2021
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : septembre 2021
    Messages : 297
    Points : 841
    Points
    841
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    when  ( journee in('lundi','mardi','mercredi','jeudi','vendredi') and DATEPART(HOUR, heure) >= 20 and DATEPART(HOUR, heure) <= 5 ) 
            OR ( journee = 'samedi' and DATEPART(HOUR, heure) <= 5 ) 
    then 'NUIT'

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    mai 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : mai 2006
    Messages : 392
    Points : 1 002
    Points
    1 002
    Par défaut
    Bonjour,

    La structure de votre table me paraît bizarre. Normalement, vous devriez stocker la date et l'heure dans un unique champ datetime. Il y a peut-être une bonne raison de scinder ces infos mais je me demande laquelle. En revanche, le jour de la semaine peut être déterminé avec la fonction datepart, donc il est totalement inutile de stocker cette info séparément.
    Donc en gardant le case when et en appliquant la fonction datepart vous pouvez faire quelque chose de plus simple.

    Attention si vous utilisez between avec des champs date ou datetime, il faut bien comprendre le fonctionnement et les limitations: https://www.techtarget.com/searchora...TETIMEs-in-SQL

  6. #6
    Membre éclairé Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    septembre 2021
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : septembre 2021
    Messages : 297
    Points : 841
    Points
    841
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    La structure de votre table me paraît bizarre. Normalement, vous devriez stocker la date et l'heure dans un unique champ datetime.
    type DATETIME2 plutôt.

    Citation Envoyé par binarygirl Voir le message
    Il y a peut-être une bonne raison de scinder ces infos mais je me demande laquelle. En revanche, le jour de la semaine peut être déterminé avec la fonction datepart, donc il est totalement inutile de stocker cette info séparément.
    Donc en gardant le case when et en appliquant la fonction datepart vous pouvez faire quelque chose de plus simple.
    Tout à fait d'accord, on espère très fort que ce sont des champs calculés et pas des colonnes en VARCHAR.

Discussions similaires

  1. CASE WHEN avec opérateur IN
    Par bossun dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/12/2009, 15h32
  2. Utilisation CASE WHEN avec une liste de valeurs
    Par mortimer.pw dans le forum PL/SQL
    Réponses: 5
    Dernier message: 26/03/2009, 12h50
  3. Sql CASE/WHEN avec HyperFile
    Par iniaina dans le forum HyperFileSQL
    Réponses: 5
    Dernier message: 21/11/2008, 10h37
  4. CASE WHEN avec un comportement anormal
    Par damien.sans dans le forum Oracle
    Réponses: 5
    Dernier message: 23/08/2006, 10h03
  5. case/when avec plusieurs valeurs pour le then
    Par Neo41 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2005, 15h58

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