Есть ли чистый и простой метод форматирования целого числа, которое представляет собой количество минут, в десятичное представление часов и минут. Очень жаль, что в T-SQL нет такой вещи, как Timespan для поддержки этого.
Просто чтобы было ясно, что я имею в виду, если у меня есть 70 минут, я хочу преобразовать их в представление 1 часа и 10 минут, то есть 1.10. Я также хочу сохранить его как varchar или что-то в этом роде, чтобы убедиться, что конечный ноль остается на месте.
В любом случае, это можно создать как пользовательскую функцию в SQL, чтобы ее можно было повторно использовать из разных запросов?
Ответ 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