Eu 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
O que é a maneira correta de adicionar @MinutesToAdd
minutos para @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 resulta em perda de precisão.
- Questões ou preocupações a serem observadas no caso de os minutos serem muito grandes para caberem em uma
time
variável ou o risco de rolar atime
variável. Se não houver problemas, informe-o.
sql-server
sql-server-2008
Trisped
fonte
fonte
Respostas:
Você não pode usar aritmética abreviada de taquigrafia com os novos tipos. Tentar:
Observe que, embora você tenha protegido o seu
@MinutesToAdd
estouro, você não protegeu o resultado do estouro. Isso não gera um erro, no entanto, pode não ser o resultado esperado.Resultado:
Presumo que isso deva passar por algum tipo de conversão interna, porque você não conseguiu esse resultado dizendo:
Resultado:
Você precisa considerar como deseja lidar com os cálculos que levam a um
@EndTime
ou ambos@StartTime
e@EndTime
a realizar 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.fonte
DATEADD
retorna o mesmo tipo que o argumento de data, aceitarei. O "Impedir estouro, se necessário?" linha não é necessária. O problema de rolagem será tratado pela origem dos dados e pelo destino dos dados.Basta usar a função dateadd para adicionar seus minutos em número inteiro contra '0:00'. Depois, volte ao tempo.
Selecionar elenco (datados (minutos, 84, '0: 00') como hora)
Aqui, 84 é o minuto inteiro que eu quero que seja expresso no tipo "hora".
Eu adicionei isso a '0:00' e, para remover o componente de data, eu o converto no tipo de hora. Não é necessária codificação personalizada.
(Sem nome da coluna)
01: 24: 00.0000000
fonte