Как добавить минуты к типу данных времени?


10

У меня есть хранимая процедура, которая вставляет две записи в таблицу, разница между записями заключается в том, что столбец времени второй записи находится @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переменной. Если проблем нет, укажите это.

5
Я не вижу, как ваше изменение вашего вопроса еще больше проясняет данный вопрос.
swasheck

@swasheck Я четко заявляю о трех вещах, которые я ищу. Я также устанавливаю границы того, что я не ищу.
Trisped

Ответы:


36

Вы не можете использовать ленивую стенографическую арифметику с новыми типами. Пытаться:

DATEADD(MINUTE, @MinutesToAdd, @StartTime)

Обратите внимание, что даже если вы защитили свой @MinutesToAddот переполнения, вы не защитили результат от переполнения. Это не приводит к ошибке, однако, может не соответствовать ожидаемому результату.

DECLARE @StartTime TIME(0) = '23:59';
DECLARE @MinutesToAdd INT = 20;

SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime);

Результат:

00:19:00

Я предполагаю, что это должно пройти некоторый тип внутреннего преобразования, потому что вы не можете получить этот результат, сказав:

DECLARE @StartTime TIME(0) = '24:19';

Результат:

Сообщение 241, Уровень 16, Состояние 1, Строка 1
Преобразование не удалось при преобразовании даты и / или времени из строки символов.

Вам нужно подумать, как вы хотите обрабатывать расчеты, которые приводят к одному @EndTimeили обоим, @StartTimeи @EndTimeбыть на следующий день.

Кроме того - для удовлетворения еще одного нового требования в вашем «идеальном ответе» - нет потери точности. Согласно документации , тип возвращаемого значения DATEADDсовпадает с типом ввода:

Возвращаемый тип данных - это тип данных аргумента даты , за исключением строковых литералов.

Поэтому, TIMEво, TIMEвне.


1
+1 @Aaron В качестве альтернативы вы можете преобразовать StartTime и TimeToAdd в datetime, а затем добавить. Преобразование TimeToAdd будет очень запутанным, когда минуты> 59. DATEADD - лучшее решение.
Брайан

Если вы добавите, что DATEADDвозвращает тот же тип, что и аргумент даты, то я приму. «Предотвратить переполнение при необходимости?» Линия не нужна. Проблема пролонгации будет обрабатываться источником данных и местом назначения данных.
Trisped

3
@ Надежно уверен, если вы добавите к вопросу, что вы не считаете DATEADD подходящим, потому что думаете, что он может возвращать только DATETIME и что это может вызвать проблемы. В противном случае это не кажется актуальным для вашего вопроса или для будущих читателей ...
Аарон Бертран

Как релевантность не подразумевается в «Обратите внимание, что я использую тип данных времени»? Кроме того, почему вы изменили мой вопрос на непостоянное использование строки вместо записи?
Trisped

1
@ Трип-редактирование использует лучшую терминологию и, пожалуйста, ознакомьтесь с разделом часто задаваемых вопросов о редактировании - у меня больше нет вопросов назад или вперед, или я заблокирую вопрос. Аарон прав, что нам нужно прояснить все для других, у вас есть свой ответ. Пожалуйста, подумайте над тем, чтобы отредактировать свой вопрос в соответствии с предложениями, которые он предлагает, если вы считаете, что это будет полезно: Аарон любезно предложил добавить информацию, которую вы хотите, в свой ответ, если вы это сделаете.
Джек говорит, попробуйте topanswers.xyz

0

Просто используйте функцию dateadd, чтобы добавить ваши минуты в целое число против «0:00». Тогда отбрось время назад.

Выберите приведение (dateadd (минута, 84, '0: 00') в качестве времени)

Здесь 84 - целая минута, которую я хочу выразить в виде «времени».

Я добавил это к 0:00, а затем, чтобы удалить компонент даты, я помещаю его в тип времени. Нет необходимости в пользовательском кодировании.

(Без названия столбца)

01: 24: 00,0000000

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.