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 :

Faire une requête pour une période de temps


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut Faire une requête pour une période de temps
    Bonjour,

    Voilà, j'ai un probleme à vous soumettre.

    J'ai 3 tables sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table Définition : 
    colonne ID : id unique,
    colonne Designation : texte de description,
    colonne qty : Quantité d'éléments contenu dans le stock total
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table Demande : 
    colonne ID : id unique autoincrémenté,
    colonne Debut : Date de début,
    colonne Fin : Date de fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table Element :
    colonne id_dmd : id de la demande,
    colonne id_definition : id de la définition,
    colonne qty : quantité d'élements inclus dans la demande
    Donc, vous avec X demandes de reservation, chaque demande contient Y Element correspondant à chaque fois une Definition

    J'avais réussi a faire une requete +/- simple permettant d'avoir le nombre d'élément total d'une définition contenue dans les demandes avec une date précise.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select sum(qty) from Element where id_definition = 1 and id_dmd in (select * from Demande where Debut < datedemande and Fin > datedemande)

    Bon, ca marche.
    Mais, maintenant, je voudrais savoir si c'est possible de faire 1 requete pour avoir l'information sur une periode de temps donnée et tous les jours.

    J'ai réussi à le faire en faisant une boucle date après date (en PHP).
    Mais, je voulais savoir si c'etait possible, par exemple, pour 1 an, de faire 1 requete au lieu des 365.

    Merci.
    Florence

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Pour savoir s'il y a chevauchement de deux plages de dates (Plage_A et Plage_B), il faut:
    • Que la date de début de la plage B soit antérieure à la date de fin de la plage A
    • Que la date de fin de la plage B soit supérieur à la date de début de la plage A

    Donc ici tu peux considérer que la plage A corresponde à la demande, et que la plage B soit celle que tu veux tester.

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    L'expression de besoins n'est pas très claire, il aurait été préférable de communiquer le vrai DDL de création des tables.

    De ce que j'en ai compris, une demande est concernée par un à plusieurs éléments et un élément concerne une et une seule demande

    ce faisant, on peut créer le modèle tabulaire suivant :

    Code SQL : 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
    create table DE_demande
          (  DE_ident   integer  identity primary key
           , DE_dtdeb   date     not null
           , DE_dtfin   date     not null
          )
    ;
    create table EL_element
          (  DE_ident   integer  not null
           , EL_seq     integer  not null
           , EL_qte     decimal(9,2) not null
           , primary key (DE_ident, EL_seq)
           , foreign key (DE_ident)
                     references DE_demande(DE_ident)
                     on delete cascade
          )
    ;


    À partir de là, si on crée un petit jeu d'essai :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    insert into DE_demande (DE_dtdeb, DE_dtfin)
    values ('2022-01-03', '2022-01-08')
         , ('2022-01-10', '2022-01-15')
         , ('2022-01-17', '2022-01-22')
    ;
    insert into EL_element (DE_ident, EL_seq, EL_qte)
    values (1, 1, 0055.00)
         , (1, 2, 0121.00)
         , (1, 3, 0010.00)
         , (2, 1, 1000.00)
         , (2, 2, 1000.00)
         , (3, 1, 0150.00)
         , (3, 2, 0200.00)
    ;


    La requête suivante doit correspondre au besoin :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select DE.DE_ident
         , DE.DE_dtdeb
         , DE.DE_dtfin
         , sum(EL.EL_qte)  as TOT
    from DE_demande as DE
    inner join EL_element as EL
       on EL.DE_ident=DE.DE_ident
    group by DE.DE_ident
           , DE.DE_dtdeb
           , DE.DE_dtfin


    Résultat :

    DE_ident DE_dtdeb DE_dtfin TOT
    1 2022-01-03 2022-01-08 186.00
    2 2022-01-10 2022-01-15 2000.00
    3 2022-01-17 2022-01-22 350.00


    Il n'y a plus qu'à ajouter une restriction (WHERE) sur la période recherchée

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Quel dommage que SQL Server n'implémente pas l'opérateur (normalisé) OVERLAPS...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    il me semble que seul postgre le propose

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    OVERLAPS est également dispo dans Oracle, mais non documentée, donc à éviter.

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Disponible dans Teradata depuis des lustres
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Mea culpa : après vérification, DB2 l'implémente aussi.

    MariaDB également, mais... pour les chevauchement de données spatiales, rien à voir avec les dates !

    Voir ICI

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Rien ne vous empêche de créer une UDF qui fait la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR ALTER FUNCTION F_OVERLAPS (@D1 sql_variant, @F1 sql_variant, @D2 sql_variant, @F2 sql_variant)
    RETURNS BIT
    WITH RETURNS NULL ON NULL INPUT
    AS
    BEGIN
    RETURN CASE WHEN @D1 >= @F2 OR @D2 >= @F1 THEN 0 ELSE 1 END
    END;
    GO
    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/ * * * * *

Discussions similaires

  1. [AC-2007] Comment faire une moyenne de temps exprimé en Min et Sec dans une requete
    Par irimi54 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 02/07/2019, 16h07
  2. Réponses: 2
    Dernier message: 01/07/2019, 18h43
  3. insert pour faire une table de temps
    Par PAYASS59 dans le forum SQL
    Réponses: 7
    Dernier message: 02/07/2010, 07h52
  4. [XI] Calcul de valeurs dans un graphique avec une periode de temps
    Par campia dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 23/04/2007, 09h17
  5. Comment faire une mirroir en temps reels de mon ecran?
    Par pointer dans le forum DirectX
    Réponses: 7
    Dernier message: 04/06/2005, 02h56

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