Tengo un procedimiento almacenado que inserta dos registros en una tabla, la diferencia entre los registros es que la columna de tiempo del segundo registro es @MinToAddposterior a la primera:
CREATE PROCEDURE CreateEntry
/*Other columns*/
@StartTime time(2),
@EndTime time(2),
@MinutesToAdd smallint
AS
BEGIN
SET NOCOUNT ON;
SET @MinutesToAdd = @MinutesToAdd % 1440; --Prevent overflow if needed?
IF (@MinutesToAdd > 0)
BEGIN
INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
OUTPUT inserted.id
VALUES
(/*Other columns*/ @StartTime, @EndTime),
(/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
END
ELSE
BEGIN
/*Whatever ELSE does.*/
END
END
¿Cuál es la forma correcta de agregar @MinutesToAddminutos a @StartTimey @EndTime?
Tenga en cuenta que estoy usando el timetipo de datos.
Actualización :
una respuesta correcta debe contener la siguiente información:
- Cómo agregar minutos a un
timetipo de datos. - Que la solución propuesta no resulta en una pérdida de precisión.
- Problemas o inquietudes a tener en cuenta en el caso de que los minutos sean demasiado largos para caber en una
timevariable, o riesgo de volcar latimevariable. Si no hay problemas, indíquelo.
sql-server
sql-server-2008
Trisped
fuente
fuente

Respuestas:
No puede usar aritmética abreviada perezosa con los nuevos tipos. Tratar:
Tenga en cuenta que aunque haya protegido su
@MinutesToAddcontra desbordamiento, no ha protegido el resultado del desbordamiento. Esto no produce un error, sin embargo, es posible que no sea el resultado que espera.Resultado:
Supongo que esto debe pasar por algún tipo de conversión interna, porque no podría obtener ese resultado diciendo:
Resultado:
Debe considerar cómo desea manejar los cálculos que conducen a uno
@EndTimeo ambos@StartTimey@EndTimeestar en el día siguiente.Además, para abordar otro nuevo requisito en su "respuesta ideal", no hay pérdida de precisión. Según la documentación , el tipo de retorno de
DATEADDes el mismo que la entrada:Por lo tanto,
TIMEadentro,TIMEafuera.fuente
DATEADDdevuelve el mismo tipo que el argumento de fecha, entonces aceptaré. El "Prevenir el desbordamiento si es necesario?" No se necesita línea. El problema de transferencia será manejado por la fuente de los datos y el destino de los datos.Simplemente use la función dateadd para agregar sus minutos en entero contra '0:00'. Luego regresa al tiempo.
Seleccionar reparto (dateadd (minuto, 84, '0: 00') como hora)
Aquí, 84 es el minuto entero que quiero expresar en el tipo "tiempo".
Agregué eso a '0:00' y luego para eliminar el componente de fecha, lo convierto al tipo de hora. No se necesita codificación personalizada.
(Sin nombre de columna)
01: 24: 00.0000000
fuente