У меня есть хранимая процедура, которая вставляет две записи в таблицу, разница между записями заключается в том, что столбец времени второй записи находится @MinToAdd
после первой:
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
Как правильно добавить @MinutesToAdd
минуты к @StartTime
и @EndTime
?
Обратите внимание, что я использую time
тип данных.
Обновление :
правильный ответ должен содержать следующую информацию:
- Как добавить минуты к типу
time
данных. - Это предлагаемое решение не приводит к потере точности.
- Проблемы или опасения, о которых следует знать в случае, если минуты будут слишком большими, чтобы поместиться в
time
переменную, или риск перестановкиtime
переменной. Если проблем нет, укажите это.
sql-server
sql-server-2008
Trisped
источник
источник
Ответы:
Вы не можете использовать ленивую стенографическую арифметику с новыми типами. Пытаться:
Обратите внимание, что даже если вы защитили свой
@MinutesToAdd
от переполнения, вы не защитили результат от переполнения. Это не приводит к ошибке, однако, может не соответствовать ожидаемому результату.Результат:
Я предполагаю, что это должно пройти некоторый тип внутреннего преобразования, потому что вы не можете получить этот результат, сказав:
Результат:
Вам нужно подумать, как вы хотите обрабатывать расчеты, которые приводят к одному
@EndTime
или обоим,@StartTime
и@EndTime
быть на следующий день.Кроме того - для удовлетворения еще одного нового требования в вашем «идеальном ответе» - нет потери точности. Согласно документации , тип возвращаемого значения
DATEADD
совпадает с типом ввода:Поэтому,
TIME
во,TIME
вне.источник
DATEADD
возвращает тот же тип, что и аргумент даты, то я приму. «Предотвратить переполнение при необходимости?» Линия не нужна. Проблема пролонгации будет обрабатываться источником данных и местом назначения данных.Просто используйте функцию dateadd, чтобы добавить ваши минуты в целое число против «0:00». Тогда отбрось время назад.
Выберите приведение (dateadd (минута, 84, '0: 00') в качестве времени)
Здесь 84 - целая минута, которую я хочу выразить в виде «времени».
Я добавил это к 0:00, а затем, чтобы удалить компонент даты, я помещаю его в тип времени. Нет необходимости в пользовательском кодировании.
(Без названия столбца)
01: 24: 00,0000000
источник