Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/05/2011, 13h14   #1
Invité régulier
 
Alexandre Hardy
Inscription : novembre 2010
Messages : 46
Détails du profil
Informations personnelles :
Nom : Alexandre Hardy
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2010
Messages : 46
Points : 5
Points : 5
Par défaut Datediff moins d'un jour

Bonjour,

J'ai un procédure stockée censée vérifier qu'un enregistrement date de plus ou moins d'un jour ( soit 24h ).
En faisant :

DATEDIFF(hh,@Date,GETDATE())>=24j'ai l'impression que la fonction ne s’intéresse qu'aux heures et ne prend donc pas en compte les jours...
Est-ce normal ?
scartik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/05/2011, 16h09   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
j'ai l'impression que la fonction ne s’intéresse qu'aux heures et ne prend donc pas en compte les jours...
Est-ce normal ?
Non pas du tout DATEDIFF vous retourne bien le nombre d'heure d’écart entre les deux dates:
Code :
1
2
3
4
declare @date datetime=getdate()
declare @date2 datetime=dateadd(hour,-56,getdate())
 
SELECT DATEDIFF(hh,@date,@date2)
Résultat:-56

faites un PRINT du résultat dans votre cas pour voir la valeur retournée par votre DATEDIFF
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h08   #3
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 194
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 194
Points : 746
Points : 746
Si vous écrivez votre query comme suit

Code :
1
2
3
4
 
SELECT *
FROM dbo.maTable
WHERE maDate > DATEADD(dd, -1, GETDATE())
vous pourrez alors tirez profit d'un indexe sur la date (ici : colonne maDate).
De nombreuse autres écritures ne permettraient pas cela.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 20h51   #4
Invité régulier
 
Alexandre Hardy
Inscription : novembre 2010
Messages : 46
Détails du profil
Informations personnelles :
Nom : Alexandre Hardy
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2010
Messages : 46
Points : 5
Points : 5
Donc faire ma comparaison à l'aide d'un DATEADD au lieu d'un DATEDIFF serait plus intéressant en terme de performance ?
scartik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 04h50   #5
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 668
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 668
Points : 8 718
Points : 8 718
Bonjour,

Ce n'est pas le fait d'uitliser DATEDIFF() ou DATEADD() qui feront que votre requête sera plus performante.

SQL Server maintient des statistiques de distribution des valeurs pour chacune des colonnes d'une table, et sur les index.
En revanche, il ne maintient pas de statistiques sur la différence en heures ou en jours entre les valeurs de date d'une colonne et la date du jour.
Donc il ne peut pas prévoir la quantité de lignes qui vérifient votre prédicat.
Donc il choisira de lire toute la table.

Dans la requête de Sergejack, comme DATEADD(dd, -1, GETDATE()) est une constante, et que son prédicat exprime un filtre direct sur la colonne maDate, SQL Server est capable d'estimer le nombre de lignes de la table qui vérifieront le prédicat.
C'est pour cela que Sergejack a écrit :

Citation:
Envoyé par SergeJack
vous pourrez alors tirez profit d'un indexe sur la date (ici : colonne maDate).
Je vois invite à lire ce petit billet.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/05/2011, 10h09   #6
Invité régulier
 
Alexandre Hardy
Inscription : novembre 2010
Messages : 46
Détails du profil
Informations personnelles :
Nom : Alexandre Hardy
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2010
Messages : 46
Points : 5
Points : 5
Merci, effectivement c'est très intéressant !
scartik est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h52.


 
 
 
 
Partenaires

Hébergement Web