J'ai une table de données que je souhaite sélectionner via Proc stocké de telle sorte que les utilisateurs puissent connecter une extrémité frontale MS Excel et utiliser les données brutes comme source de graphique. P>
Le problème avec les données brutes de la table existe des lacunes dans les dates, car s'il n'y a pas de données pendant une journée donnée (il n'y a pas d'enregistrement avec cette date), alors lorsque les utilisateurs tentent de graphiquement, cela crée des problèmes. p>
Je veux trop de mettre à jour mon procédé stocké à gauche Joignez-vous à une table de dates temporaires afin que le côté droit apparaisse comme des nulls que je puisse jeter à zéro pour qu'ils disposent d'une expérience de tracé simple. P>
Comment puis-je générer le mieux une table d'un terrain de dates entre une date de début et de fin? p>
3 Réponses :
dans SQL Server 2005 et plus, vous pouvez utiliser quelque chose comme celui-ci (une expression de table commune CTE) pour le faire: vous pouvez rejoindre l'extérieur gauche code> ce CTE contre votre table et renvoie le résultat. P> P>
Enfin! Merci pour ça. Cela semblait être comme il devrait être si simple et pourtant toutes les autres réponses à des questions très similaires impliquées de créer des fonctions ou des tables permanentes. C'est exactement la solution dont j'avais besoin et fonctionne parfaitement.
C'est le moyen plus facile, mais s'il pousse des milliers ou des millions de dates, il a une mauvaise performance par rapport à une table temporelle ou permanente. Consultez cette page: SQLSERVERCRATRAL.COM/Articles/T-SQL/74118
Une solution serait avec un CTE:
with cte_dates as (
select cast('20110119' as datetime) as [date]
union all
select dateadd(dd, 1, [date])
from cte_dates
where dateadd(dd, 1, [date]) <= '20111231'
)
select [date], YourColumn
from cte_dates
left join YourTable
on ...
option (maxrecursion 0);
+1 Parce que votre message a été soumis à la minute exacte de la réponse acceptée, et parce que votre clause où votre clause est plus robuste que celle (cela fonctionne pour des intervalles supérieurs à 1, qui est négligé dans la réponse acceptée).
Une autre façon de le faire est avec une table de mémoire. Il ne vous étonnera pas en raison de la restriction des limitations telles que certaines des solutions ci-dessus.
DECLARE @dates AS TABLE ([Date] date);
DECLARE @date date = {d '2010-10-01'};
DECLARE @endDate date = {d '2010-11-01'};
while (@date < @endDate)
BEGIN
INSERT INTO @dates VALUES (@date);
SET @date = dateadd(DAY, 1, @date)
END
SELECT * FROM @dates;
Utilisez cette solution si vous obtenez "la récursion maximale a été épuisée."
Vous recherchez un générateur de séquence; Ce était l'article que j'ai utilisé pour Mine de base lors de la dernière fois que j'en avais besoin. Bien que, bien sûr, si vous voulez juste le faire une fois, un curseur ou une boucle simple ferait bien ...