Як додати хвилини до типу даних про час?


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 в дату часу, а потім додати. Перетворення TimeToAdd буде дуже безладним, коли хвилини становлять> 59. DATEADD - найкраще рішення.
Брайан

Якщо ви додасте, що DATEADDповертає той же тип, що і аргумент дати, я прийму. "Попередити переповнення за потреби?" рядок не потрібен. Випуск перевертання буде оброблятися джерелом даних та пунктом призначення даних.
Trisped

3
@ Упевнений, якщо ви додасте до питання, що ви не вважаєте, що DATEADD є підходящим, оскільки ви думаєте, що він може повернути лише DATETIME і це може спричинити проблеми. Інакше це не здається важливим для вашого питання чи для майбутніх читачів ...
Аарон Бертран

Як відповідність не мається на увазі "Зверніть увагу, я використовую тип даних про час". Крім того, чому ви змінили моє запитання, щоб непомітно використовувати рядок замість запису?
Trisped

1
@Trisped редагування використовує кращу термінологію, і, будь ласка, дивіться файл редагування - улетів більше не буде назад, або я заблокую питання. Аарон має рацію, що нам потрібно зробити все зрозумілим для інших, ти маєш свою відповідь. Будь-ласка, подумайте, як редагувати своє запитання у відповідності до запропонованих ним питань, якщо ви вважаєте, що це буде корисно: Аарон люб'язно запропонував додати інформацію, яку ви хочете, до своєї відповіді, якщо ви це зробите.
Джек каже, спробуйте topanswers.xyz

0

Просто скористайтеся функцією dateadd, щоб додати свої хвилини в цілому чи «0:00». Потім відкидають час.

Виберіть час (дата, додана (хвилина, 84, '0: 00') як час)

Тут 84 - це ціла хвилина, яку я хочу виразити у типі "time".

Я додав, що до "0:00", а потім, щоб видалити компонент дати, додаю його до типу часу. Не потрібно спеціальне кодування.

(Без імені стовпця)

01: 24: 00.0000000

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.