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 [2017]


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    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 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    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 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 789
    Points
    30 789
    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 éprouvé Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 448
    Points : 1 293
    Points
    1 293
    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 chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    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 éprouvé Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 448
    Points : 1 293
    Points
    1 293
    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.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 417
    Points
    1 417
    Par défaut
    Citation Envoyé par facteur Voir le message
    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
    Bonsoir,
    J'ai juste une question. Vu qu'il n'y a qu'une information d'horodatage je suppose que c'est, au choix, celle de début ou de fin de la vacation.
    Vu que le jeu de test qui répond à la tranche Nuit peut être le jour ou le lendemain, j'en déduit que l'horodatage n'est pas fixe ; comme pourrait l'être une prise d'astreinte par exemple.
    Je suppute donc que l'heure de début et de fin ne sont pas fixes, ni l'une ni l'autre.

    Dans les 2 cas suivants on lira 'NUIT' pour le début et 'MATIN' pour la fin des vacations suivantes :
    * une prise à 4h59 et une fin à 5h01
    * une prise à 20h et une fin à 12h29, 2 jours plus tard

    Pouvez vous expliciter ce qui est attendu ?
    Le savoir est une nourriture qui exige des efforts.

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

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