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 :

Requete avec comparaison de deux dates


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2009
    Messages : 48
    Points : 31
    Points
    31
    Par défaut Requete avec comparaison de deux dates
    Bonjour à tous,

    Je dois faire une requete dont une des conditions est de récupérer toutes les lignes dont ma date d'envoi de mon mail (champ SendDate) est égal à maintenant mais sans prendre en compte les secondes.

    exemple :
    id SendDate
    1 2009-11-06 16:19:19.456
    2 2009-11-06 16:20:52.652
    3 2009-11-06 16:20:26.354
    4 2009-11-06 16:21:12.333
    5 2009-11-06 16:21:59.548

    Si on est le 06/11/2009 à 16h20, je veux qu'il me retourne les lignes 2 et 3.

    La requete intéroge une base de donnée SQL Server 2008.

    Merci pour votre aide.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Essaye la condition suivante
    where datediff(minute,SendDate,getdate())<=0

    Le principe est d'utiliser la fonction datediff avec la granulométrie que tu veux (minute, hour, day,..)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2009
    Messages : 48
    Points : 31
    Points
    31
    Par défaut
    Ca marche !!!

    Merci beaucoup. Té trop génial !!!!

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Mais il est mieux d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE SendDate > DATEADD(minute, -1, GETDATE())
    Parce que dans ce cas vous pourrez utiliser l'éventuel index sur la colonne, évitant ainsi le scan de table, long et coûteux : votre prédicat devient cherchable

    @++

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Bonjour

    comment fait-on si on voulait que les heures, les minutes, et les secondes ne soient pas pris en compte ?

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE SendDate between getdate() and getdate()
    et aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where sendDate <= getdate and sendDate >= getdate()
    mais je n'obtiens pas la bonne réponse.

    Je veux prendre seulement les lignes dont sendDate est égal à getdate() mais sans tenir compte de l'heure et des minutes et des secondes.

    je suis sur SQL 2000.

    Merci de votre aide.


    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Mais il est mieux d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE SendDate > DATEADD(minute, -1, GETDATE())
    Parce que dans ce cas vous pourrez utiliser l'éventuel index sur la colonne, évitant ainsi le scan de table, long et coûteux : votre prédicat devient cherchable

    @++

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    La fonction GETDATE() retourne la date courante du système.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE SendDate BETWEEN getdate() AND getdate()
    Cela ne peut pas fonctionner puisque vous cherchez les lignes dont les valeurs de la colonne SendDate sont entre maintenant et maintenant.
    Cela suppose donc que vous venez d'insérer une ligne, et que vous êtes parvenez à la sélectionner dans la même milliseconde ...

    C'est la même chose ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE sendDate <= getdate AND sendDate >= getdate()
    Je veux prendre seulement les lignes dont sendDate est égal à getdate() mais sans tenir compte de l'heure et des minutes et des secondes.
    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE SendDate > CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME)
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE SendDate  > CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
    @++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Excuse moi Elsuket, tes deux essais marchent bien.
    Prière d'ignorer mon message précédent. Je voulais le supprimer mais j'ai pas pu. y a t-il moyen de supprimer un message qui nous appartient pour les prochaines fois ?

    Merci beaucoup.

    Citation Envoyé par elsuket Voir le message
    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE SendDate > CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME)
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE SendDate  > CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
    @++
    Les deux essais ne me donnent pas le résultat escompté.

    Ma table contient une ligne avec le champ SendDate égal à 09/11/2009

    Remarque :
    Lorsque j'exécute ma requête sur Query Analyser mon champ SendDate apparait comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2009-11-09 00:00:00.000
    mais lorsque j'exécute ma requête sur Entreprise mananger, mon champ SendDate apparait comme ça :
    je suis sur SQL 2000 et mon champ SendDate est de type Datetime 8

    Merci.

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Si vous exécutez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME)
    SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
    Vous obtenez deux fois : 2009-11-09 00:00:00.000

    Donc en utilisant le symbole >, vous n'obtenez évidement aucune ligne, et il vous faut le remplacer par >=, ou =, suivant votre besoin.

    Lorsque j'exécute ma requête sur Query Analyser mon champ SendDate apparait comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2009-11-09 00:00:00.000
    mais lorsque j'exécute ma requête sur Entreprise mananger, mon champ SendDate apparait comme ça :

    C'est ce que je répète parfois: les dates, lorsqu'elles sont stockées avec le type DATETIME, le sont avec 4 octets : 2 pour la date, et 2 pour l'heure. Ce que vous en voyez, quelle que soit l'interface, n'en est qu'un représentation.
    Il suffit d'ailleurs de consulter l'aide de la fonction CONVERT() pour voir qu'SQL Server n'offre pas moins de 20 représentations possible d'une date

    @++

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

Discussions similaires

  1. Comparaison de deux dates avec heure
    Par mokochan dans le forum MATLAB
    Réponses: 5
    Dernier message: 29/04/2013, 17h10
  2. Requete avec comparaison avec la date du jour
    Par marpolo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/10/2009, 15h27
  3. Problème de requete avec comparaison de date
    Par crabe71 dans le forum Linq
    Réponses: 2
    Dernier message: 23/07/2009, 09h39
  4. [VB6] Comparaison de deux dates dans une requête
    Par paradeofphp dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/06/2006, 19h45
  5. Réponses: 6
    Dernier message: 26/07/2005, 10h20

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