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

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

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

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


person Dafydd Giddins    schedule 22.05.2009    source источник
comment
после долгих поисков я нашел отличный ответ Здесь< /а>   -  person Nabaraj Ghimire    schedule 09.04.2020


Ответы (3)


Чтобы получить часы, вы хотите разделить на 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.

person lc.    schedule 22.05.2009
comment
Просто помните, что если вы собираетесь разделить целое число и надеетесь получить обратно десятичные дроби, вы должны поместить результат в соответствующий тип данных. - person TheTXI; 22.05.2009
comment
Я не думаю, что вы понимаете, что я имею в виду. Если у меня есть 70 минут, я хочу преобразовать их в представление 1 часа и 10 минут, то есть 1:10. Я переформулирую свой вопрос, чтобы было понятно - person Dafydd Giddins; 22.05.2009
comment
-1 Боюсь, это не то, что он ищет. idstam имеет правильный ответ. - person John M Gant; 22.05.2009
comment
@daffers: Ты прав, я не понял с первого раза. Как я уже сказал, я, должно быть, что-то упустил. - person lc.; 22.05.2009
comment
@jmgant: Да, теперь я исправил свой ответ, когда понял, что искал вопрос. Проверьте редакцию OP, когда я впервые опубликовал этот ответ, и скажите, что вы не читаете его так же, хотя ... :) - person lc.; 22.05.2009
comment
@лк. Я реализую ваше строковое представление (вторая часть), у него возникают проблемы, если от модуля меньше 10 минут. например 66 минут становятся 1:6 вместо 1:06... - person egerardus; 21.02.2013
comment
@Geronimo Ты прав, это не идеальное представление. Я отредактировал свой ответ, который, надеюсь, решит проблему. - person lc.; 21.02.2013
comment
Работает на меня. +1 для вас! - person Jens Bergvall; 27.06.2014

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

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
person Eminem    schedule 12.09.2012
comment
Вы добавляете один и тот же ответ на несколько разных вопросов? Ошибка копирования и вставки или что-то в этом роде? И, пожалуйста, учтите, что если вы не добавите что-то новое к другим ответам, вам не нужно возрождать трехлетний пост. Но спасибо за ваши усилия. - person fancyPants; 25.09.2012

В SQL Server 2012:

SELECT format(DATEADD(minute, 70, 0), N'hh\.mm')
person JMat    schedule 20.12.2016