Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Формат минут в часы и минуты в виде десятичного числа в T-SQL

Автор вопроса: Dafydd GiddinsОтветов: 3

Есть ли чистый и простой метод форматирования целого числа, которое представляет собой количество минут, в десятичное представление часов и минут. Очень жаль, что в T-SQL нет такой вещи, как Timespan для поддержки этого.

Просто чтобы было ясно, что я имею в виду, если у меня есть 70 минут, я хочу преобразовать их в представление 1 часа и 10 минут, то есть 1.10. Я также хочу сохранить его как varchar или что-то в этом роде, чтобы убедиться, что конечный ноль остается на месте.

В любом случае, это можно создать как пользовательскую функцию в SQL, чтобы ее можно было повторно использовать из разных запросов?

  • после долгих поисков я нашел отличный ответ Здесь< /а> Nabaraj Ghimire 09.04.2020

tsql

Ответы

Ответ 1 · рейтинг 17 · lc.

Чтобы получить часы, вы хотите разделить на 60. Чтобы получить оставшиеся минуты, вы хотите либо взять общее количество минут по модулю 60, либо разницу между общим количеством минут и часов, умноженных на 60. Чтобы остаток отображался справа от десятичный разряд, разделить на 100,0:

SELECT minutes / 60 + (minutes % 60) / 100.0 ...

Обратите внимание, что вы потеряете конечный ноль, и ИМХО, сохранение продолжительности времени таким образом - плохая идея, потому что а) вы больше не можете делать с ним математические операции и б) кто-то запутается, когда они посмотрят на этот код позже.

Гораздо лучше использовать строковое представление, подобное следующему (и я рекомендую снова использовать ':' вместо '.', чтобы обозначить это не число):

SELECT CAST((minutes / 60) AS VARCHAR(8)) + ':' +
       RIGHT('0' + CAST((minutes % 60) AS VARCHAR(2)), 2) ...

Что касается создания пользовательской функции, вы можете создать хранимую процедуру, а затем вызвать ее из другого кода. Обратите внимание, что хранимая процедура должна быть создана в каждой базе данных.

Не уверен, что хранимая процедура стоит затраченных усилий, если только вы не хотите быть более изобретательным и возвращать строку, подобную TimeSpan.

Ответ 2 · Eminem

Я потратил некоторое время, пытаясь сделать то же самое, вот как я это сделал:

convert( varchar, cast((RouteMileage / @average_speed) as integer))+ ':' +  convert( varchar, cast((((RouteMileage / @average_speed) - cast((RouteMileage / @average_speed) as integer)) * 60) as integer)) As TravelTime,

dateadd( n, -60 * CAST( (RouteMileage / @average_speed) AS DECIMAL(7,2)), @entry_date) As DepartureTime

ВЫХОД:

DeliveryDate                TravelTime             DepartureTime
2012-06-02 12:00:00.000       25:49         2012-06-01 10:11:00.000

Ответ 3 · рейтинг -2 · JMat

В SQL Server 2012:

SELECT format(DATEADD(minute, 70, 0), N'hh\.mm')

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы