Формат минут в часы и минуты в виде десятичного числа в 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)


arrow_upward
17
arrow_downward

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

arrow_upward
0
arrow_downward

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

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

arrow_upward
-2
arrow_downward

В SQL Server 2012:

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