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

MS SQL Server Discussion :

between entre 2 dates de 6 h à 6 h


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Points : 53
    Points
    53
    Par défaut between entre 2 dates de 6 h à 6 h
    Je souhaite faire une requête entre 2 dates dont
    - la première date serait = getdate() -1 à 6h00
    - la seconde date serait getdate() sachant que le serveur fait les mises à jour 1 fois par jour à 6 h.

    Ci-dessous, ma requête :
    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
    26
    27
    28
    29
    30
    31
    SELECT  I.ID_INTERVENTION_SDIS Num_Inter,
            S.REG_1 Categorie,
           CEN.LIB_CENTRE Centre,
            CEN.ID_GROUPEMENT Grpt_Centre,
            YEAR(I.DH_DEBUT_INTER) Annee,
            I.DH_DEBUT_INTER Date,
            DATEPART(HOUR,I.DH_DEBUT_INTER) Heure
    FROM              OPS_SINISTRE S 
     
            INNER JOIN OPS_INTERVENTION I ON S.ID_SINISTRE=I.ID_SINISTRE
            INNER JOIN OPS_CENTRE CEN ON CEN.ID_CENTRE=I.ID_CENTRE_PRINC
     
    WHERE   I.DH_DEBUT_INTER > CAST(CONVERT(VARCHAR,DATEADD(d,-1 ,GETDATE()),103)AS DATETIME)--Editer tel quel, je me retrouve avec un getdate() - 1 à 00h00
            AND CEN.ID_GROUPEMENT NOT LIKE 'NR'
            AND S.REG_1 NOT LIKE 'Non renseigné'
     
    SELECT  I.ID_INTERVENTION_SDIS Num_Inter,
            S.REG_1 Categorie,
           CEN.LIB_CENTRE Centre,
            CEN.ID_GROUPEMENT Grpt_Centre,
            YEAR(I.DH_DEBUT_INTER) Annee,
            I.DH_DEBUT_INTER Date,
            DATEPART(HOUR,I.DH_DEBUT_INTER) Heure
    FROM              OPS_SINISTRE S 
     
            INNER JOIN OPS_INTERVENTION I ON S.ID_SINISTRE=I.ID_SINISTRE
            INNER JOIN OPS_CENTRE CEN ON CEN.ID_CENTRE=I.ID_CENTRE_PRINC
     
    WHERE   I.DH_DEBUT_INTER > CAST(CONVERT(VARCHAR,DATEADD(d,-1 ,GETDATE()),103)AS DATETIME)
            AND CEN.ID_GROUPEMENT NOT LIKE 'NR'
            AND S.REG_1 NOT LIKE 'Non renseigné'
    Vous en remerciant par avance.

    Cordialement

    Taz

  2. #2
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    I.DH_DEBUT_INTER > dateadd(HH,6,CAST(CONVERT(VARCHAR,DATEADD(d,-1 ,GETDATE()),103)AS DATETIME)) and I.DH_DEBUT_INTER <GETDATE()
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  3. #3
    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
    Bonjour

    Vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE   I.DH_DEBUT_INTER > DATEADD(HOUR, -18, CAST(CAST(GETDATE() AS DATE) AS DATETIME))

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    1 - La solution proposée par aieeeuuuuu est de loin la meilleure solution, mais elle est valable uniquement à partir de SQL Server 2008.
    Par ailleurs, Les performances de cette solution (temps CPU, etc.) sont bien meilleures. En effet le CAST de DATETIME en DATE et inversement sont extrêmement efficaces comparés aux CONVERT(..., 103). La différence entre les 2 méthodes ne devient tangible qu'à partir de quelques millions d'opérations (exemple 5 millions d'opérations).

    2 - Concernant les autres solutions proposées : Attention au style 103 !!!
    Le style de format 103 tel qu'il est utilisé dans la fonction CONVERT (exemple CONVERT(varchar, @UneDate, 103)), n'est pas universel !
    Le style 103 générera des erreurs dans d'autres contextes culturels (autres langues, pays et cultures) ! le style 103 est étroitement lié à certaines langues, pays et cultures !

    A moins que vos produits ciblent uniquement le marché français ce qui peut être un choix, somme toute respectable, évitez d'utiliser le style 103 et plus généralement les expressions littérales de date au format dd/mm/yyyy

    Ci-dessous un exemple de contexte où la fonction CONVERT, utilisée avec le style 103, générera assurément des erreurs :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SET LANGUAGE us_english 
    DECLARE @Unedate datetime 
    SET @UneDate = '2014-10-24T00:00:00';  -- le 24 octobre 2014.  Date exprimée au format ISO 
    SELECT CAST(CONVERT(VARCHAR, @UneDate , 103) AS DATETIME)

    Résulat : KO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Changed language setting to us_english.
     
    (1*ligne(s) affectée(s))
    Msg*242, Niveau*16, État*3, Ligne*7
    The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
    Explication

    Le fait de définir LANGUAGE a us_english a pour effet implicite de définir le DATEFORMAT à MDY

    Le système essaye de convertir le 24/10/2014 mais sous l'acception mm/dd/yyyy, c.à.d, pour lui, il s'agit du 10/24/2014 (au format dd/mm/yyyy)
    Comme le mois 24 n'existe pas, cela explique l'erreur générée ci-dessus.

    Pour corriger cette erreur et faire en sorte que votre code s'affranchit des pays, langues et autres cultures, il faut utiliser le style 126 (ISO8601) comme indiqué ci-dessous :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SET LANGUAGE us_english 
    DECLARE @Unedate datetime 
     -- le 24 octobre 2014. Date exprimée au format ISO 
    SET @UneDate = '2014-10-24T00:00:00'; 
    SELECT CAST(CONVERT(VARCHAR, @UneDate , 126) AS DATETIME)
    Résultat : OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2014-10-24 00:00:00.000
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  5. #5
    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 hmira Voir le message
    mais elle est valable uniquement à partir de SQL Server 2008.
    En effet.
    Pour les versions antérieures, mieux vaut cependant rester sur le fonctions dates pour manipuler les dates plutôt que la conversion en varchar.
    Dans ce cas, on peut faire ainsi pour obtenir "la veille d’aujourd’hui à 6h00" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DATEADD(HOUR, -18,DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0))

  6. #6
    Membre du Club
    Homme Profil pro
    Je produit des statistiques pour le SDIS 47.
    Inscrit en
    Avril 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Je produit des statistiques pour le SDIS 47.
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 73
    Points : 53
    Points
    53
    Par défaut
    Merci pour votre aide, cela fonctionne formidablement bien.

    Cordialement

    Taz

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

Discussions similaires

  1. BETWEEN entre deux date
    Par info3licen dans le forum Développement
    Réponses: 2
    Dernier message: 24/06/2011, 19h08
  2. Réponses: 5
    Dernier message: 09/07/2007, 11h57
  3. Between entre 2 dates : comment inclure les bornes
    Par vallica dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/06/2006, 14h37
  4. Réaliser un BETWEEN entre 2 dates (mois, année)
    Par PpPool dans le forum Oracle
    Réponses: 3
    Dernier message: 26/04/2006, 10h20
  5. Comment utiliser Between entre 2 dates en SQL DELPHI/Paradox
    Par tarbala dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/04/2006, 10h33

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