Gostaria de criar um procedimento armazenado que criará uma linha em uma tabela para todos os dias em um determinado período. O procedimento armazenado aceita duas entradas - uma data de início e uma data de término do período desejado pelo usuário.
Então, digamos que eu tenha uma tabela assim:
SELECT Day, Currency
FROM ConversionTable
O dia é um DateTime e a moeda é apenas um número inteiro.
Para simplificar, digamos que eu sempre quero que a coluna Moeda seja 1 para cada uma dessas linhas inseridas. Portanto, se alguém inserir '5 de março de 2017' como data de início e '11 de abril de 2017' como data de término, gostaria que as seguintes linhas fossem criadas:
2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1
Qual é a melhor maneira de codificar o procedimento armazenado para fazer isso? Estou usando o SQL Server 2008 R2 no meu ambiente de teste, mas nosso ambiente real usa o SQL Server 2012, para que eu possa atualizar minha máquina de teste se houver uma nova funcionalidade introduzida em 2012 que facilite essa tarefa.
MAXRECURSION
dica à consulta a ser resolvida.DATEADD(DAY, 1, theDate) < @EndDate
, não chegará ao fim do intervalo quando os dois valores de data e hora tiverem o mesmo componente de tempo. Modifiquei a resposta adequadamente, mas usando<= @EndDate
. Se você não deseja que o valor do final do intervalo seja incluído independentemente, então< @EndDate
estaria realmente correto.Outra opção é usar uma função com valor de tabela. Essa abordagem é muito rápida e oferece um pouco mais de flexibilidade. Você fornece o intervalo de data / hora, datepart e incremento. Também oferece a vantagem de incluí-lo em um CROSS APPLY
Por exemplo
Devoluções
A UDF se estiver interessado
fonte
Usando a postagem de Aaron Bertrand sobre como criar uma tabela de dimensão de data como exemplo, eu vim com isso:
Você deve poder colocar esse tipo de lógica em seu procedimento armazenado e adicionar o que mais precisar.
fonte
Recentemente, tive que resolver um problema semelhante no Redshift, onde só tinha acesso de leitura e, portanto, precisava de uma solução puramente baseada em SQL (sem procedimentos armazenados) para obter uma linha a cada hora em um intervalo de datas como ponto de partida para o meu conjunto de resultados. Tenho certeza de que outras pessoas podem tornar isso mais elegante e modificá-lo para seus propósitos, mas para aqueles que precisam, aqui está minha solução invadida:
fonte