Tenho um procedimento armazenado que insere dois registros em uma tabela, a diferença entre os registros é que a coluna de tempo do segundo registro é @MinToAdd
posterior ao primeiro:
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
Qual é a maneira correta de adicionar @MinutesToAdd
minutos a @StartTime
e @EndTime
?
Observe que estou usando o time
tipo de dados.
Atualização :
Uma resposta correta deve conter as seguintes informações:
- Como adicionar minutos a um
time
tipo de dados. - Que a solução proposta não resulte em perda de precisão.
- Problemas ou preocupações a serem observados no caso de os minutos serem muito grandes para caber em uma
time
variável ou risco de rolar atime
variável. Se não houver problemas, por favor, indique-o.
Você não pode usar aritmética abreviada preguiçosa com os novos tipos. Tentar:
Observe que, embora você tenha protegido o seu
@MinutesToAdd
contra estouro, você não protegeu o resultado do estouro. Isso não gera um erro, no entanto, pode não ser o resultado que você espera.Resultado:
Eu suponho que isso deve passar por algum tipo de conversão interna, porque você não poderia obter esse resultado dizendo:
Resultado:
Você precisa considerar como deseja lidar com cálculos que levam a um
@EndTime
ou ambos@StartTime
e@EndTime
a ser no dia seguinte.Além disso - para abordar outro novo requisito em sua "resposta ideal" - não há perda de precisão. De acordo com a documentação , o tipo de retorno de
DATEADD
é o mesmo que a entrada:Portanto,
TIME
dentro,TIME
fora.Basta usar a função dateadd para adicionar seus minutos em número inteiro contra '0:00'. Em seguida, lançado de volta ao tempo.
Selecione cast(dateadd(minute,84,'0:00') como time)
Aqui, 84 é o minuto inteiro que quero que seja expresso no tipo "tempo".
Eu adicionei isso a '0:00' e, em seguida, para remover o componente de data, eu o converti para o tipo de hora. Nenhuma codificação personalizada necessária.
(Sem nome de coluna)
01:24:00.0000000