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 :

Recherche toute les dates entre deux dates


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Points : 295
    Points
    295
    Par défaut Recherche toute les dates entre deux dates
    Existe-t-il une fonction permettant de récuperer toute les dates entre deux dates ?

    Par exemple: SELECT DateBetween('2007/02/25', '2007/03/02')

    Et qui renvoit
    2007/02/25
    2007/02/26
    2007/02/27
    2007/02/28
    2007/03/01
    2007/03/02

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Cela n'existe pas, tu dois crées des Number/Tally table.

    Mais, comme je suis un mec cool, voici les miennes :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    -- 2009-12-07
    CREATE VIEW dbo.v_VIRTUAL_NUMBERS
    AS
    WITH
    L1 AS (SELECT 1 AS n UNION ALL SELECT 1) -- 2^1
    , L2 AS (SELECT X.n FROM L1, L1 AS X) -- (2^1)^2 = 2^2
    , L3 AS (SELECT X.n FROM L2, L2 AS X) -- (((2^1)^2)^2 = 2^4
    , L4 AS (SELECT X.n FROM L3, L3 AS X) -- ((((2^1)^2)^2)^2 = 2^8
    , L5 AS (SELECT X.n FROM L4, L4 AS X) -- (((((2^1)^2)^2)^2)^2 = 2^16
    , L6 AS (SELECT X.n FROM L5, L5 AS X) -- ((((((2^1)^2)^2)^2)^2)^2 = 2^32
    SELECT ROW_NUMBER() OVER (ORDER BY n) AS n FROM L6
    GO
     
    -- 2009-12-08
    IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[v_VIRTUAL_YEARS]'))
    DROP VIEW [dbo].[v_VIRTUAL_YEARS]
    GO
     
    CREATE VIEW dbo.v_VIRTUAL_YEARS
    AS
    SELECT
    	CAST(n AS INT) AS yyyy
    	, DATEADD(yyyy, (n - 1900), '01-01-1900') AS [begin]
    	, DATEADD(yyyy, (n + 1 - 1900), '01-01-1900') AS [end]
    FROM dbo.v_VIRTUAL_NUMBERS
    WHERE n BETWEEN 1900 AND 2078
    GO
     
    -- 2010-01-05
    IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[v_VIRTUAL_DAYS]'))
    DROP VIEW [dbo].[v_VIRTUAL_DAYS]
    GO
     
    CREATE VIEW dbo.v_VIRTUAL_DAYS
    AS
    SELECT
    	Y.yyyy AS yyyy
    	, N.n - 1 AS dy
    	, DATEADD(dd, N.n - 1, Y.[begin]) AS date
    FROM (
    	SELECT
    		Y.*
    		, DATEDIFF(dd, Y.[begin], Y.[end]) AS DDIF
    	FROM dbo.v_VIRTUAL_YEARS AS Y
    ) AS Y
    INNER LOOP JOIN dbo.v_VIRTUAL_NUMBERS AS N ON (
    	N.n >= 1
    	AND
    	N.n <= 366
    	AND
    	N.n <= Y.DDIF
    )
    GO
    Il ne te reste qu'à faire ton select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT date
    FROM dbo.v_VIRTUAL_DAYS
    WHERE date between '2007-02-25' AND '2007-03-02'

  3. #3
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Bonjour,

    Une solution plus simple d'après moi consiste à utiliser une fonction SQL utilisant une CTE recursive (SQL Server 2008 vu le type date utilisé):

    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
     
    CREATE FUNCTION [dbo].[DatesTable]
    (
      @FirstDate date,
      @LastDate date
    )
    RETURNS @datetable TABLE (
      [date] date
    )
    AS
    BEGIN
     
      WITH CTE_DatesTable
      AS
      (
        SELECT @FirstDate AS [date]
        UNION ALL
        SELECT DATEADD(dd, 1, [date])
        FROM CTE_DatesTable
        WHERE DATEADD(dd, 1, [date]) <= @LastDate
      )
      INSERT INTO @datetable ([date])
      SELECT [date] FROM CTE_DatesTable
      OPTION (MAXRECURSION 0);
     
      RETURN;
    END
    Pour son utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT [date]
    FROM [dbo].[DatesTable](GETDATE(), DATEADD(dd,5,GETDATE()))

    Ici une version fonctionnant sous 2005:
    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
    CREATE FUNCTION [dbo].[DateTable]
    (
      @FirstDate datetime,
      @LastDate datetime
    )
    RETURNS @datetable TABLE (
      [date] datetime
    )
    AS
    BEGIN
     
      SELECT @FirstDate = DATEADD(dd, 0, DATEDIFF(dd, 0, @FirstDate));   SELECT @LastDate = DATEADD(dd, 0, DATEDIFF(dd, 0, @LastDate)); 
      WITH CTE_DatesTable
      AS 
      (
        SELECT @FirstDate AS [date]
        UNION ALL
        SELECT DATEADD(dd, 1, [date])
        FROM CTE_DatesTable
        WHERE DATEADD(dd, 1, [date]) <= @LastDate
      )
      INSERT INTO @datetable ([date])
      SELECT [date] FROM CTE_DatesTable
      OPTION (MAXRECURSION 0)
     
      RETURN
    END
    Son utilisation est similaire à la fonction pour 2008.

    Bonne journée

  4. #4
    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 386
    Points
    18 386
    Par défaut
    Une table calendrier c'est encore mieux à mon avis.

    SQLPro a écrit un cours sur un modèle complet :
    http://sqlpro.developpez.com/cours/gestiontemps/

Discussions similaires

  1. Liste de TOUTES les dates entre deux dates (sans table)
    Par boulate dans le forum Requêtes
    Réponses: 5
    Dernier message: 22/08/2013, 11h00
  2. Sélectionner toutes les dates entre deux dates
    Par corgato dans le forum Langage
    Réponses: 2
    Dernier message: 09/11/2008, 20h50
  3. Chercher les dimanches entre deux dates !
    Par sablito dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/12/2007, 22h05
  4. [Dates] Les mois entre deux dates
    Par kagura dans le forum Langage
    Réponses: 2
    Dernier message: 28/06/2006, 11h38
  5. [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

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