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 @MinToAdd
posterior 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 @MinutesToAdd
minutos a @StartTime
y @EndTime
?
Tenga en cuenta que estoy usando el time
tipo de datos.
Actualización :
una respuesta correcta debe contener la siguiente información:
- Cómo agregar minutos a un
time
tipo 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
time
variable, o riesgo de volcar latime
variable. 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
@MinutesToAdd
contra 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
@EndTime
o ambos@StartTime
y@EndTime
estar 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
DATEADD
es el mismo que la entrada:Por lo tanto,
TIME
adentro,TIME
afuera.fuente
DATEADD
devuelve 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