Me gustaría crear un procedimiento almacenado que creará una fila en una tabla para cada día en un rango de fechas determinado. El procedimiento almacenado acepta dos entradas: una fecha de inicio y una fecha de finalización del intervalo de fechas deseado por el usuario.
Entonces, digamos que tengo una tabla así:
SELECT Day, Currency
FROM ConversionTable
El día es una fecha y hora, y la moneda es solo un número entero.
Para simplificar las cosas, digamos que siempre quiero que la columna Moneda sea 1 para cada una de estas filas insertadas. Entonces, si alguien ingresa '5 de marzo de 2017' como la fecha de inicio y '11 de abril de 2017' como la fecha de finalización, me gustaría crear las siguientes filas:
2017-03-05 00:00:00, 1
2017-03-06 00:00:00, 1
...
2017-04-11 00:00:00, 1
¿Cuál es la mejor manera de codificar el procedimiento almacenado para hacer esto? Estoy usando SQL Server 2008 R2 en mi entorno de prueba, pero nuestro entorno real usa SQL Server 2012, por lo que puedo actualizar mi máquina de prueba si hay una nueva funcionalidad introducida en 2012 que facilita esta tarea.
MAXRECURSION
pista a la consulta para resolver.DATEADD(DAY, 1, theDate) < @EndDate
, no obtiene el final del rango cuando ambos valores de fecha y hora tienen el mismo componente de tiempo. Modifiqué la respuesta apropiadamente, pero usando<= @EndDate
. Si no desea que se incluya el valor del final del rango, entonces< @EndDate
sería correcto.Otra opción es utilizar una función con valores de tabla. Este enfoque es muy rápido y ofrece un poco más de flexibilidad. Usted proporciona el rango de fecha / hora, la fecha y el incremento. También ofrece la ventaja de incluirlo en una APLICACIÓN CRUZADA
Por ejemplo
Devoluciones
El UDF si está interesado
fuente
Usando la publicación de Aaron Bertrand sobre cómo crear una tabla de dimensiones de fecha como ejemplo, se me ocurrió esto:
Debería poder poner este tipo de lógica en su procedimiento almacenado y agregar cualquier otra cosa que necesite.
fuente
Tuve que resolver un problema similar recientemente en Redshift, donde solo tenía acceso de lectura y, por lo tanto, necesitaba una solución puramente basada en SQL (sin procedimientos almacenados) para obtener una fila por cada hora en un rango de fechas como punto de partida para mi conjunto de resultados. Estoy seguro de que otros pueden hacer esto más elegante y modificarlo para sus propósitos, pero para aquellos que lo necesitan, aquí está mi solución pirateada:
fuente