7
votes

générer une table SQL TIMP de dates séquentielles à gauche

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.

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.

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.

Comment puis-je générer le mieux une table d'un terrain de dates entre une date de début et de fin?


1 commentaires

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 ...


3 Réponses :


13
votes

dans SQL Server 2005 et plus, vous pouvez utiliser quelque chose comme celui-ci (une expression de table commune CTE) pour le faire: xxx

vous pouvez rejoindre l'extérieur gauche ce CTE contre votre table et renvoie le résultat.


2 commentaires

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



6
votes

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 commentaires

+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).



6
votes

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;


1 commentaires

Utilisez cette solution si vous obtenez "la récursion maximale a été épuisée."