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 :

Récupérer tous les jours entre deux dates


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant Technique
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant Technique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Récupérer tous les jours entre deux dates
    Bonjour,

    Comment,à partir d'une requête, sortir tout les jours compris entre deux dates, une occurrence par date, je met un exemple:

    tout les jours entre 01/04/2012 et 31/05/2012 le résultat souhaité est:

    1. 01/04/2012
    2. 02/04/2012
    3. 03/04/2012
    4. 04/04/2012
    5. .......
    6. 29/05/2012
    7. 30/05/2012
    8. 31/05/2012


    Si ça peut aider, j'ai une requête qui le fait mais seulement c'est du PL/SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT level + to_date('01-04-2012','DD-MM-RRRR') - 1 as jour from dual
    connect by level < to_date('31-05-2012','DD-MM-RRRR') - to_date('31-05-2012','DD-MM-RRRR') + 2
    D'avance merci!

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Créez une table calendrier qui contient tous les jours. SQLPRO propose un article bien complet sur la gestion du temps avec, notamment, un modèle de tables pour la gestion calendaire : http://sqlpro.developpez.com/cours/gestiontemps/

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Tout-à-fait d'accord avec vmolines pour le calendrier.
    Ça ne coûte pas cher à implémenter.

    Pour dépanner, vous pouvez passer par une CTE :
    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
    declare @dt1 datetime;
    declare @dt2 datetime;
     
    set @dt1 = CONVERT(datetime, '01/04/2012', 103);
    set @dt2 = CONVERT(datetime, '31/05/2012', 103);
     
    With Calendrier (dt) as
    (
    select @dt1
     union all
    select dt + 1
      from Calendrier
     where dt < @dt2
    )
      select dt
        from Calendrier
    order by dt asc;

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Consultant Technique
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant Technique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Merci a tout les deux pour vos réponses qui sont des points d'attaques assez intéressent, mais une contrainte est qu'il me faut utiliser qu'une seule requête.

    Je testerais, demain, tout de même la CTE, peut-être que ça passera (je vous tiendrez au courant).

    Sinon s'il y a d'autre proposition je suis aussi preneur

    Merci encore

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Une fois la table "calendrier" en place, la requête est unique et on ne peut plus simple.

    Si vous parlez de la création du calendrier qui doit se faire via proc stock ou autre, ce n'est plus mono requête, mais c'est à faire une seule fois. Considérez ça comme partie intégrante de la structure. N'hésitez pas à générer 200 ans d'un coup pour ne plus en parler, cela ne représente que 73000 lignes mono colonne. Avec un type date, la taille des données est ridicule.

    Pour les autres propositions, sans être péremptoire, elles seront mauvaises. Quand vous requêtez un SGBD, vous lui demandez des lignes qui existent. Si vous voulez "inventer" ces lignes à la volée (proc stock qui renvoie une table ou autre artifice), vous allez à l'encontre du fonctionnement de prédilection et ce sera une moins bonne solution.

    Vous avez besoin des jours du calendrier ? Faites une table qui les contient.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Consultant Technique
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant Technique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour,


    alors j'ai finalement opté pour une fonction qui renvoie une table :

    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
     
    CREATE FUNCTION [dbo].[fn_getJours](@_dateDeb datetime
    									,@_dateFin datetime )
    				RETURNS @tb_dates TABLE (dates datetime NOT NULL )
    				WITH SCHEMABINDING
    AS
    BEGIN
    	set @_dateDeb = CAST(FLOOR(CAST(@_dateDeb AS FLOAT)) AS DATETIME)
    	set @_dateFin = CAST(FLOOR(CAST(@_dateFin AS FLOAT)) AS DATETIME)
     
    	WHILE @_dateDeb <= @_dateFin
    	BEGIN
     
    		INSERT INTO @tb_dates (dates) VALUES (@_dateDeb)
    		SELECT @_dateDeb = DATEADD(day, 1, @_dateDeb)
     
    	END
     
    	RETURN
    END
    GO
    J'ai lu vos réponse et bien compris que c'est pas la meilleure solution (puisque rien ne peut remplacer une bonne vieille table ) , mais pour mon cas c'est la plus adapté

    Pour la CTE j'ai eu un probleme à cause la récursivité (limite à 100)

    merci tout le monde

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par GsusNET Voir le message
    Pour la CTE j'ai eu un probleme à cause la récursivité (limite à 100)
    Un petit tour sur MSDN vous aurait permis de découvrir l'option maxrecursion.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2023
    Messages : 1
    Points : 1
    Points
    1
    Par défaut solution assez simple (testée sur SQL Server)
    Bonjour, ayant eu besoin d'avoir une requête qui me retourne toutes les dates calendaires sur une plage de dates, je suis tombé sur ce topic. J'ai trouvé sur le Net une solution alternative assez simple :
    Dans l'exemple ci-dessous : Afficher toutes les dates calendaires comprises entre le 15/12/2020 et le 12/01/2024

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  TOP (DATEDIFF(DAY, '2020-12-15', '2024-01-12') + 1)
        DateCal = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1,'2020-12-15')
    FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b

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

Discussions similaires

  1. Script pour compter les jours entre deux dates
    Par bomonde dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 17/10/2012, 18h54
  2. Lister tous les jours entre deux dates ?
    Par Gigli dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2012, 17h50
  3. Tous les jours entre deux dates
    Par karamurat dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/01/2011, 15h53
  4. Calculer les jours entre deux dates
    Par Daniela dans le forum SQL
    Réponses: 4
    Dernier message: 09/10/2008, 17h01
  5. Réponses: 2
    Dernier message: 25/02/2008, 23h40

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