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

Langage SQL Discussion :

[ WinDev ] Calcul sur date dans SQL


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut [ WinDev ] Calcul sur date dans SQL
    Bonjour à tous,

    voilà plusieurs jours que je tourne en rond....

    J'essaye de faire une requête SQL programmée en WINDEV 9. Le but est de sélectionner certains enregistrements selon une date Fin calculée.
    Fin est un champ calculé directement dans la requête pour filtrer.

    Par exemple, je souhaite récupérer toutes les inscriptions se terminant après le 22/08/2006. Disons que chaque inscription dure 200 jours pour simplifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
    T_inscription.intitule AS Inscription,
    T_inscription.date_debut AS Debut,
    T_inscription.date_debut + 200 AS Fin
    FROM T_inscription
    WHERE Fin > "22/08/2006"
    Comment faire pour calculer Fin ? Y a une fonction spécifique ?
    Les calculs doivent se faire directement dans la requête pour faire le filtrage... non ?

    Merci d'avance....
    @ bientot

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    En SQL, quand un champ est "calculé", même si il est baptisé par le biais d'un alias, il est nécessaire de le reprendre tel quel si l'on souhaite s'en servir dans une clause WHERE.

    Si Fin = Début + 200, alors ta requête s'écrira :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
    T_inscription.intitule AS Inscription,
    T_inscription.date_debut AS Debut,
    T_inscription.date_debut + 200 AS Fin
    FROM T_inscription
    WHERE T_inscription.date_debut + 200 > "22/08/2006"
    (j'ai, comme toi, omis de formatter la date via une fonction spécifique, ne connaissant pas hyperfile)
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Tout à fait vrai pour l'alias.

    Malheureusement cela ne m'avance pas beaucoup...

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    En ce qui me concerne, je ne vois pas comment t'aider plus : explique-nous comment est calculée "Fin", peut-être serons-nous plus à même de comprendre ton problème et d'essayer de le résoudre
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    ok ok

    Un client s'inscrit à une date (T_inscription.date_debut) à une activité (ex : cours) d'une discipline sportive (ex : natation). Cette activité à une durée (T_activite.duree) en général : 12 mois. Le client peut se blesser durant cette période sans être pénalisé. Il a donc la notion de temps mort (T_inscription.temps_mort).

    La date de fin a calculer est donc :
    DateFin = T_inscription.date_debut + T_inscription.temps_mort + T_activite.duree

    Exemple : Mr Dupond s'est inscrit au cours (activité) de natation (discipline) 12 mois le 2 janvier 2006. Il s'est malheureusement casser le poignet, il est en arrêt 2 semaines.
    DateFin = 2/01/2006 + 12 mois + 14 jours

    Pour le moment, j'ai :
    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
    SELECT
    T_client.id AS ID,
    T_client.nom AS Nom,
     
    T_discipline.intitule AS Discipline,
    T_activite.intitule AS Activite,
    T_inscription.date_debut_activite AS Debut,
    T_inscription.temps_mort AS Temps_mort,
     
    T_inscription.date_debut_activite AS Fin___Debut,
    T_inscription.temps_mort AS Fin___TempsMort_en_jours,
    T_activite.duree AS Fin___Duree_en_mois,
     
    FROM T_activite, T_discipline, T_inscription, T_client
     
    WHERE T_discipline.id = T_activite.id_discipline
    AND T_activite.id = T_inscription.id_activite
    AND T_client.id = T_inscription.id_client
     
    ORDER BY T_client.nom ASC
    Après DateFin calculé, le but est de lister toutes les inscriptions se terminant dans les 10 jours à partir de la DATESYS pour effectuer des 'relances'.

    Voilà, j'espère avoir été clair et que vous pourrez m'aider...

    Merci

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    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 848
    Points : 52 966
    Points
    52 966
    Billets dans le blog
    6
    Par défaut
    En "pur" SQL, votre requête devrait s'écrire :

    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
     
    SELECT C.id AS ID, 
           C.nom AS Nom, 
     
           D.intitule AS Discipline, 
     
           A.intitule AS Activite, 
           A.duree AS Fin___Duree_en_mois, 
     
           I.date_debut_activite AS Debut, 
           I.temps_mort AS Temps_mort, 
           I.temps_mort AS Fin___TempsMort_en_jours, 
     
    FROM T_activite A
         INNER JOIN T_discipline D
               ON D.id = A.id_discipline 
         INNER JOIN T_inscription I
               ON A.id = I.id_activite
         INNER JOIN T_client C
               ON C.id = I.id_client
     
    WHERE I.date_debut + I.temps_mort MONTH + A.duree MONTH > CURRENT_DATE + 10 DAYS
     
     
    ORDER BY C.nom ASC
    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/ * * * * *

  7. #7
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    merci SQLpro...

    apparemment Windev ne prend pas cette syntaxe (MONTH, DAY, etc ...) pour mes fichiers HyperFile (mes tables)...

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    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 848
    Points : 52 966
    Points
    52 966
    Billets dans le blog
    6
    Par défaut
    Voudrait tu dire que Hyperfile ne comprend donc pas la syntaxe de la version 1992 de SQL ???

    Il serait peut être temps de passer à un produit plus évolué !!! ;-)

    Dans ce cas, regarde dans l'aide en ligne d'Hyperfile comment ajouter des durées à des dates. Par exemple sous MS SQL Server c'est DATEADD.

    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/ * * * * *

  9. #9
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Dans l'aide WinDev :
    Les "commandes SQL" (instructions, fonctions, clauses, ...) utilisables dans une requête SQL vérifiée par le moteur Hyper File sont les suivantes :

    ALL
    Utilisé avec l'instruction SELECT
    Sélectionne tous les enregistrements

    Utilisé avec l'opérateur UNION
    Sélectionne les enregistrements communs

    Utilisé dans les sous-requêtes

    AS
    Crée un alias pour chaque rubrique et chaque fichier utilisé

    ASC
    Utilisé avec la clause ORDER BY
    Définit l'ordre ascendant

    AVG
    Calcule la moyenne d'un ensemble de valeurs

    AND
    Combine plusieurs conditions de sélection (l'une et l'autre)

    ANY
    Utilisé dans les sous-requêtes

    BETWEEN
    Sélectionne des enregistrements dont la valeur d'une rubrique appartient à une plage de valeurs

    BOTTOM
    Renvoie uniquement les n derniers enregistrements du résultat d'une requête

    COUNT
    Renvoie le nombre d'enregistrements présents dans un fichier ou dans un groupement d'enregistrements

    DELETE
    Supprime des enregistrements d'un fichier

    DESC
    Utilisé avec la clause ORDER BY
    Définit l'ordre descendant

    DISTINCT
    Utilisé avec l'instruction SELECT
    Supprime les enregistrements dupliqués (doublons) du résultat de la requête

    EXISTS
    Utilisé dans les sous-requêtes

    FULL OUTER JOIN
    Réalise une jointure externe

    FROM
    Utilisé avec l'instruction SELECT
    Définit les fichiers utilisés

    Utilisé avec l'instruction DELETE
    Définit les fichiers utilisés

    GROUP BY
    Classe une sélection d'enregistrement par groupe

    HAVING
    Permet de spécifier une ou plusieurs conditions sur des groupes d'enregistrements générés par la clause GROUP BY

    IN
    Sélectionne des enregistrements dont les valeurs correspondent à une liste de valeurs spécifiée

    Utilisé dans les sous-requêtes

    INNER JOIN
    Réalise une jointure interne

    INSERT
    Ajoute un enregistrement dans un fichier de données

    INSTR
    Renvoie la position d'une chaîne de caractères

    INTO
    Utilisé avec l'instruction INSERT
    Définit le fichier utilisé

    IS NULL
    Sélectionne des enregistrements pour lesquels la valeur d'une rubrique est nulle

    LEFT
    Extrait les premiers caractères du contenu d'une rubrique de fichier ou d'une chaîne de caractères

    LEFT OUTER JOIN
    Réalise une jointure externe

    LEN
    Renvoie la taille (le nombre de caractères) du contenu d'une rubrique ou d'une chaîne de caractères

    LENGTH
    Renvoie la taille (le nombre de caractères) du contenu d'une rubrique ou d'une chaîne de caractères

    LIKE
    Sélectionne des enregistrements pour lesquels la valeur d'une rubrique correspond à une valeur spécifiée (avec des caractères génériques)

    LOWER
    Convertit en minuscules le contenu d'une rubrique ou une chaîne de caractères

    LTRIM
    Renvoie une chaîne de caractères :

    soit sans les espaces situés à gauche.

    soit sans une liste de caractères.

    MAX
    Renvoie la plus grande valeur d'une rubrique pour tous les enregistrements sélectionnés dans le fichier

    MID
    Extrait une sous-chaîne, à partir d'une position donnée

    MIN
    Renvoie la plus petite valeur d'une rubrique pour tous les enregistrements sélectionnés dans le fichier

    NOT
    Inverse la signification de l'opérateur logique utilisé

    Utilisé dans les sous-requêtes

    ON
    Utilisé lors de la création d'une jointure

    OR
    Combine plusieurs conditions de sélection (l'une ou l'autre)

    ORDER BY
    Trie les enregistrements sélectionnés

    PATINDEX
    Renvoie la position de la première occurrence d'une chaîne de caractères

    RIGHT
    Extrait les derniers caractères du contenu d'une rubrique de fichier ou d'une chaîne de caractères

    RIGHT OUTER JOIN
    Réalise une jointure externe

    RTRIM
    Renvoie une chaîne de caractères :

    soit sans les espaces situés à droite.

    soit sans une liste de caractères

    SELECT
    Recherche des enregistrements dans un ou plusieurs fichiers

    SET
    Utilisé avec l'instruction UPDATE
    Définit les noms des rubriques utilisées

    SOME
    Utilisé dans les sous-requêtes

    SUBSTR
    Extrait une sous-chaîne, à partir d'une position donnée

    SUBSTRING
    Extrait une sous-chaîne, à partir d'une position donnée

    SUM
    Renvoie la somme totale des valeurs d'une rubrique pour tous les enregistrements sélectionnés dans le fichier

    TOP
    Renvoie uniquement les n premiers enregistrements du résultat d'une requête

    UNION
    Réalise des requêtes composées

    UPDATE
    Met à jour des enregistrements d'un fichier

    UPPER
    Convertit en majuscules le contenu d'une rubrique ou une chaîne de caractères

    VALUES
    Utilisé avec l'instruction INSERT
    Définit les valeurs ajoutées

    WHERE
    Permet de spécifier la ou les condition(s) de sélection d'une requête
    Ma version de Windev n'est pas vieille.... c'est la 9
    Bah tant pis je vais chercher ailleurs... y a surement moyen quand même !

    Merci quand même...

    @+

Discussions similaires

  1. Filtre sur date dans calcul total form.
    Par lbar012001 dans le forum IHM
    Réponses: 2
    Dernier message: 21/06/2010, 11h11
  2. Calcul sur date dans SQL
    Par Tchupacabra dans le forum WinDev
    Réponses: 4
    Dernier message: 27/02/2006, 19h23
  3. [débutant] calcul sur date
    Par Regis.C dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 04/01/2005, 10h51
  4. Resutlat de calcul sur date formaté
    Par neness dans le forum SQL
    Réponses: 6
    Dernier message: 16/06/2004, 15h34
  5. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55

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