Je voudrais créer une procédure stockée qui créera une ligne dans un tableau pour chaque jour dans une plage de dates donnée. La procédure stockée accepte deux entrées: une date de début et une date de fin de la plage de dates souhaitée par l'utilisateur.
Alors, disons que j'ai une table comme ça:
SELECT Day, Currency
FROM ConversionTable
Le jour est un DateTime et la devise n'est qu'un entier.
Pour simplifier les choses, disons simplement que je veux toujours que la colonne Devise soit 1 pour chacune de ces lignes insérées. Donc, si quelqu'un saisit '5 mars 2017' comme date de début et '11 avril 2017' comme date de fin, je voudrais que les lignes suivantes soient créées:
2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1
Quelle est la meilleure façon de coder la procédure stockée pour ce faire? J'utilise SQL Server 2008 R2 dans mon environnement de test, mais notre environnement réel utilise SQL Server 2012, donc je peux mettre à niveau ma machine de test si de nouvelles fonctionnalités introduites en 2012 facilitent cette tâche.
MAXRECURSION
indice à la requête à résoudre.DATEADD(DAY, 1, theDate) < @EndDate
, vous n'obtiendrez pas la fin de la plage lorsque les deux valeurs datetime ont le même composant time. J'ai modifié la réponse de manière appropriée, mais en utilisant<= @EndDate
. Si vous ne voulez pas que la valeur de fin de plage soit incluse, ce< @EndDate
serait en effet correct.Une autre option consiste à utiliser une fonction de valeur de table. Cette approche est très rapide et offre un peu plus de flexibilité. Vous fournissez la plage de date / heure, la partie de date et l'incrément. Offre également l'avantage de l'inclure dans une APPLICATION CROISÉE
Par exemple
Retour
L'UDF si vous êtes intéressé
la source
En utilisant le post d'Aaron Bertrand sur la façon de créer un tableau de dimension de date comme exemple, j'ai trouvé ceci:
Vous devriez pouvoir mettre ce type de logique dans votre procédure stockée et ajouter tout ce dont vous avez besoin.
la source
J'ai dû résoudre un problème similaire récemment sur Redshift où je n'avais qu'un accès en lecture et j'avais donc besoin d'une solution purement SQL (pas de procédures stockées) pour obtenir une ligne pour chaque heure dans une plage de dates comme point de départ pour mon jeu de résultats. Je suis sûr que d'autres peuvent rendre cela plus élégant et le modifier à leurs fins, mais pour ceux qui en ont besoin, voici ma solution piratée:
la source