Отформатируйте минуты в часы и минуты как десятичное число в T-SQL - PullRequest
5 голосов
/ 22 мая 2009

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

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

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

Ответы [ 5 ]

17 голосов
/ 22 мая 2009

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

1 голос
/ 22 мая 2009
select 70/60 + ( 70 % 60)/100.0
0 голосов
/ 20 декабря 2016

В SQL Server 2012:

SELECT format(DATEADD(minute, 70, 0), N'hh\.mm')
0 голосов
/ 23 июня 2015
CAST(Duration/60 + (duration % 60) /100.0 as Decimal(10,1))
0 голосов
/ 12 сентября 2012

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...