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 :

Dates entre deux dates


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Points : 22
    Points
    22
    Par défaut Dates entre deux dates
    Hello, bon voilà, vu que ce forum m'a déjà sauvé quelque fois... j'aurais besoin de vos lumières car je bloque un peu, j'aimerai connaître les dates entres deux dates pour une réservation.

    Je m'explique,

    ma DB :
    date_id
    date_in (2009-04-01)
    date_out (2009-04-10)

    J'aimerais trouver le moyen d'insérer dans une autre table avec un champ ladate, tout les jours entre, donc le 01, 02, 03, 04, 05, 06, 07, 08, 09 et 10

    D'avance merci

  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 875
    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 875
    Points : 53 053
    Points
    53 053
    Billets dans le blog
    6
    Par défaut
    Une base de données ne peut pas inventer les données qu'elle n'a pas. C'est pas de la magie et il n'y a ni chapeau ni lapin. Pour trouver toutes les dates entre deux jours il vous faut une table comportant toutes les dates depuis la création du monde, jusqu'à la fin de ce dernier... Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/gestiontemps/

    A +

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Et bien faites une table calendrier !

    Edit : battu par SQLPro avec une réponse nettement plus complète !

  4. #4
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 789
    Points : 3 055
    Points
    3 055
    Par défaut
    Bonjour

    Voici une fonction que j'ai créé il y a peu; elle devrait pouvoir vous aider :

    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
    26
    27
    28
    29
     
    CREATE FUNCTION [dbi].[udf_Date_GenerateCalendar] (@Year Int) 
     
    RETURNS @Date TABLE (
       [Day] [datetime] NOT NULL,
       PRIMARY KEY ([Day])
    )
    AS
     
    BEGIN
     
       WITH CTE_Days AS 
       ( 
          SELECT Cast (Cast (@Year As Char(4)) + '-01-01' As DateTime) As [Day]
          UNION ALL 
          SELECT DateAdd(day, 1, [Day])
          FROM CTE_Days 
          WHERE Year(CTE_Days.[Day]) = @Year
       ) 
     
       INSERT INTO @Date
       SELECT [Day]
       FROM CTE_Days OPTION (MAXRECURSION 366);
     
       DELETE FROM @Date WHERE Year([Day]) > @Year
     
       RETURN 
     
    END
    Cette fonction retourne un calendrier reprennant toutes les dates d'une année donnée.

    Ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [Day] FROM dbo.[udf_Date_GenerateCalendar] (2009)
    va retourner toutes les dates de 2009.

    Donc, sans modifier le corps de la fonction, vous obtiendrez la réponse à votre question grâce à l'instruction ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [Day] FROM dbo.[udf_Date_GenerateCalendar] (2009) WHERE [Day] Between Cast('20090401' As DateTime) And Cast('20090410' As DateTime)

    Note à Waldar : j'ai fais du casting explicite

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 875
    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 875
    Points : 53 053
    Points
    53 053
    Billets dans le blog
    6
    Par défaut
    Bonjour les performances catastrophiques :
    1) obliger de générer toutes les dates à chaque appel
    2) en plus une requête récursive
    3) pas d'index dans la "pseudo" table de la fonction.

    Bref, un zéro pointé si un jour je viens faire un audit de performances chez toi !!! ;-)

    A +

  6. #6
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 789
    Points : 3 055
    Points
    3 055
    Par défaut
    Tu es dur ! Cela m'apprendra à faire joujou avec les CTEs et à venir en aide à un utilisateur du forum

    Cette fonction (ouf! pour moi) n'est pas en production; c'était juste un essai de CTE pour m'y familiariser.

    OK, à ne jamais mettre en production telle qu'elle

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/07/2008, 12h10
  2. selectionner une borne de dates entre deux dates données
    Par itchyjojo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/05/2007, 07h07
  3. [Oracle 9] Une date entre deux dates !
    Par jf-nigou dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/04/2006, 10h45
  4. [VB6]sortir toutes les dates entre deux dates
    Par AlfiQue dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/02/2006, 19h09
  5. [Dates] Comparaison de date entre deux IP (anti-flood)
    Par psychoBob dans le forum Langage
    Réponses: 79
    Dernier message: 23/12/2005, 17h19

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