Renvoyer la table temporaire des dates continues

J'ai besoin de créer une fonction qui returnne un tableau de dates continues. Je passerais à une date min & max.

Je m'attends à ce qu'il puisse être appelé comme ceci:

SELECT * FROM GetDates('01/01/2009', '12/31/2009') 

J'ai actuellement un proc stocké qui fait cela, mais les exigences ont changé et maintenant je dois faire inclure datatables returnnées à l'intérieur d'une union:

  with mycte as ( select cast(@minDate as datetime) DateValue union all select DateValue + 1 from mycte where DateValue + 1 <= @maxDate ) select DateValue from mycte option (maxrecursion 1000) 

Le problème, cependant, est que j'ai besoin de mettre la récursivité à plus de 100. Selon un post de Gail Erickson [MS] sur eggheadcafe , ce n'est pas actuellement pris en charge.

Sans créer une table réelle (pas temporaire) avec juste une date, y a-t-il un moyen de le faire?

J'utilise SqlServer2005.

Votre meilleure option est d'avoir réellement un tableau physique des dates. Il n'y en a pas beaucoup pour de longues périodes, et sera beaucoup plus rapide que de les matérialiser à la volée à partir de tables temporaires ou de ctes récursifs.

Si vous choisissez (ou devez) aller avec une table ad-hoc et non permanente, cela le ferait:

 CREATE FUNCTION dbo.DateList ( @MinDate datetime ,@MaxDate datetime ) RETURNS TABLE RETURN WITH Pass0 as (select 1 as C union all select 1), --2 rows Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),--4 rows Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),--16 rows Pass3 as (select 1 as C from Pass2 as A, Pass2 as B),--256 rows Pass4 as (select 1 as C from Pass3 as A, Pass3 as B),--65536 rows Tally as (select row_number() over(order by C) as Number from Pass4) select dateadd(dd, Number - 1, @MinDate) DateValue from Tally where Number < datediff(dd, @MindAte, @MaxDate) + 2 

ALLER

Et un appel de test:

 DECLARE @MinDate datetime ,@MaxDate datetime SET @MinDate = 'Jan 1, 2009' SET @MaxDate = 'Dec 31, 2009' SELECT * from dbo.DateList(@MinDate, @MaxDate) 

Wierd – c'est le troisième post SO aujourd'hui qui impliquait des tables de pointage. Doit être une activité étrange de taches solaires en cours. Voici les liens:

count le nombre de lignes qui se produisent pour chaque date dans la plage de dates de la colonne.
Quelle est la meilleure façon de créer et de remplir une table de nombres?

quelque chose comme ça:

 CREATE FUNCTION GetDates(@StartDate DateTime, @EndDate DateTime) RETURNS @Dates Table ( aDate DateTime Primary Key Not Null) AS BEGIN Declare @ThisDate DateTime Set @ThisDate = @StartDate While @ThisDate < @EndDate begin Insert @Dates (aDate) Values(@THisDate) Set @ThisDate = @ThisDate + 1 End RETURN END GO 

assurez-vous que @EndDate est après @startdate … Ajoutez la vérification des parameters d'input pour être sûr, ou elle pourrait être exécutée pour toujours si vous la transmettez à l'envers