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 :

Quelle peut-être la valeur de starting_date dans datediff ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut Quelle peut-être la valeur de starting_date dans datediff ?
    Bonjour,
    Je cherche à obtenir toutes les lignes d'une table dont un champs datetime vaut la date de la veille.
    J'ai trouvé ça sur le net qui fonctionne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from MyTable where CreationDate >= dateadd(day, datediff(day, 1, getdate()), 0) and CreatedTime < dateadd(day, datediff(day, 0, getdate()), 0)
    Mais je ne comprends pas le 2ème argument 1 et 0 de la fonction datediff qui est censé prendre un argument de type datetime. Pourquoi 1 est interprété comme la date d'hier et 0 comme la date du jour ?
    Merci pour votre retour,

  2. #2
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Bonjour

    datediff(day, 1, getdate()) te donne le nombre de jours exact jusqu'à aujourd'hui (de 1 déc à 16 déc il y a 16 jours)

    datediff(day, 0, getdate()) te donne le nombre de jours exact jusqu'à aujourd'hui +1 (de 0 déc à 16 déc il y a 17 "jours")
    On pourrait très bien écrire à la place : (datediff(day, 1, getdate()) ) +1

    dateadd(day ... sert ensuite de recréer un format date à partir du nombre de jours. Sans heure dans la date (donc 00:00:00)

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Je vois effectivement que ça fonctionne. Ce que je cherche à obtenir c'est une doc ou une explication sur pourquoi le paramètre startdate, qui suivant la doc SQL Server datediff, peut être de type time, date, smalldatetime, datetime, datetime2, ou datetimeoffset, interprète 1 comme la date d'hier et 0 comme la date d'aujourd'hui. Je ne trouve pas cela dans la doc Microsoft.
    Merci si vous connaissez la raison autrement que par empirisme :-)

  4. #4
    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
    Par défaut
    Bonjour,

    0 et 1 sont ici implicitement convertit en DATETIME, donnant respectivement les 1er et 2 janvier 1900 à minuit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CAST(0 AS DATETIME)
    1900-01-01 00:00:00.000
    La formule que vous utilisez ajoute donc au 1 janvier 1900, le nombre de jours entre le 2 janvier 1900 et aujourd'hui. Le but principal de la formule étant de supprimer la composante horaire de la date.
    l’ennui c'est que cette méthode pose un problème d'estimation de cardinalités jusqu'à la version 2012 incluse, car le moteur prend alors le 1er janvier 1900 comme date de référence, entrainant souvent une estimation de la totalité des lignes répondant au critère.

    Quelle est votre version de SQL Server ?

    Dans votre cas, il serait plus simple de procéder à un CAST en DATE :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where CAST(CreationDate AS DATE) = CAST(DATEADD(DAY, -1, GETDATE()) AS DATE)
    voire, (moins joli, mais permettra peut-être une meilleure estimation et donc un meilleur plan d’exécution avec les moteurs < 2012) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    where CAST(CreationDate AS DATE) >= CAST(CURRENT_TIMESTAMP -1 AS DATE)
      AND  CAST(CreationDate AS DATE) < CAST(CURRENT_TIMESTAMP  AS DATE)

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Bonjour,
    La version est la suivante :
    Microsoft SQL Server 2012 (SP3-GDR) (KB4019092) - 11.0.6251.0 (X64)
    Jul 7 2017 07:14:24
    Copyright (c) Microsoft Corporation
    Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
    Vous me dites
    0 et 1 sont ici implicitement convertit en DATETIME, donnant respectivement les 1er et 2 janvier 1900 à minuit
    , c'est la raison du résultat de cette conversion implicite que je recherche justement, y a-t-il des infos à ce sujet ou bien c'est juste de manière empirique que l'on sait cela ?
    Merci,

Discussions similaires

  1. [AC-97] Concatenation de champs texte, dont 1 qui peut être sans valeur.
    Par cacoubalboa dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/08/2010, 15h26
  2. Réponses: 2
    Dernier message: 13/02/2007, 18h02
  3. Réponses: 5
    Dernier message: 09/08/2006, 11h51
  4. Réponses: 4
    Dernier message: 27/07/2006, 16h47
  5. [HTML] Peut-être trop de cellule dans ma ligne ??
    Par LE NEINDRE dans le forum Balisage (X)HTML et validation W3C
    Réponses: 15
    Dernier message: 21/02/2006, 15h54

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