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 :

Calcul différentiel de date (renouvellement de contrat)


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 26
    Points
    26
    Par défaut Calcul différentiel de date (renouvellement de contrat)
    Bonjour,

    j'ai une base client sql server 2005 dans laquelle je gère des contrat de services.
    Je souhaite créer une requête qui permet d'afficher les contrats suivant leur date de renouvellement. Ex: afficher les clients dont le contrat se renouvellement dans moins de 60 jours.

    La table qui gère les date de renouvellement de contrats de services est 'A_Date_De_Renouvellement'.

    la date de renouvellement du contrat de services est stockée champ A_Date_de_Renouvellement de la table du même nom. Le format est varchar(10) Ex: 2008-11-12

    J'ai donc écris cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select N°Contrat, NomClient, A_Date_de renouvellement 
    FROM A_Date_de_renouvellement 
    WHERE datediff(dd,A_date_de_renouvellement,getdate()) <60
    J'obtiens une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "La conversion d'un type de données CHAR en type datetime a donné une valeur hors limite de date et d'heure"
    J'ai modifié ma requête comme ceci mais tours la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select N°Contrat, NomClient, A_Date_de renouvellement 
    FROM A_Date_de_renouvellement 
    WHERE datediff(dd,A_date_de_renouvellement,convert(varchar,getdate(),102)) <60
    Auriez vous une idée?

    Merci,

    Ozzy

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Il est hautement stupide d'avoir stocker une date en littéral (Le format est varchar(10) Ex: 2008-11-12) alors qu'il existe un type DATETIME pour ce faire !

    Il faut donc commencer par transtyper votre VARCHAR en date. Mais comme vous ne l'avez pas mis au format ISO court (c'est à dire AAAAMMJJ), il faut utiliser soit le paramétrage de session SET DATEFOMAT, soit le convert.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT N°Contrat, NomClient, A_Date_de renouvellement 
    FROM A_Date_de_renouvellement 
    WHERE datediff(dd, CONVERT(DATETIME, A_date_de_renouvellement, 121) ,getdate()) < 60
    Evidemment cette requête sera totalement contre performante du fait de l'imbrication des appels de fonction. Le mieux serait de reconstruire votre table avec votre colonne en DATETIME !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Cher SQLPro,

    Merci pour votre réponse. Je reviens sur commentaire relatif a l'utilisation du format 'varchar' pour un champ date. Je ne suis pas le créateur de cette table, j'utilise une application sous sql server. J'ai créé un nouveau champ dans l'application ERP qui créé automatique une vue SQL. Ce champ de format 'Date_de_renouvellement' est bien stockée sous la forme 'Datetime' dans la table gérant les champs. Afin de faciliter les requêtes, j'utilise une vue qui est créée automatiquement pour chaque champ perso créé dans l'ERP. Effectivement, cette vue convertie le champ 'datetime' en 'varchar (10)'.

    D'autre part, j'ai trouvé la reqûete que je chechais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT N°Contrat, NomClient, A_Date_de renouvellement 
    FROM A_Date_de_renouvellement 
    WHERE A_date_de_renouvellement between getdate() and getdate() +60
    Je vous remercie pour votre aide.

    A bientôt,

    Ozzy

Discussions similaires

  1. Calcul date renouvellement contrat
    Par ym21 dans le forum Access
    Réponses: 3
    Dernier message: 30/08/2008, 18h23
  2. [Oracle8] calcul entre 2 dates
    Par bobunny dans le forum Oracle
    Réponses: 7
    Dernier message: 28/10/2005, 12h18
  3. [C#] Calcul sur les dates avec des DateTimePicker
    Par alizee971 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 02/04/2005, 17h14
  4. Calcul entre deux dates heures
    Par Isa31 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/03/2005, 13h17
  5. Calcul + Format de DATE
    Par cassi2 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/11/2004, 09h09

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