在T-SQL中将分钟格式化为小时和分钟,作为十进制数

时间:2009-05-22 16:05:36

标签: tsql

是否有一种简洁的格式化整数的方法,它是一个整数分钟的计数,分为小时和分钟的十进制表示。很遗憾T-SQL中没有Timespan这样的东西来支持这一点。

为了清楚我的意思是,如果我有70分钟,我想把它转换成1小时10分钟的表示,即1.10。我还想将它保存为varchar或其他东西,以确保尾随零保持不变。

无论如何,这可以在SQL中创建为自定义函数,以便可以从不同的查询中重用它吗?

5 个答案:

答案 0 :(得分:17)

要获得小时数,您需要除以60.要获得剩余的分钟数,您需要采用总分钟模式60或总分钟数和小时数之间的差值60.要使余数显示为小数点右边,除以100.0:

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

请注意,你将失去尾随零和恕我直言存储持续时间这种方式是一个坏主意,因为a)你不能用它做更多的数学和b)当他们看到这个时,有人会感到困惑代码。

你最好使用如下的字符串表示(我建议再次使用':'而不是'。'来表示这不是数字):

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

就创建自定义函数而言,您可以创建存储过程,然后从其他代码调用它。请注意,必须在每个数据库中创建存储过程。

不确定使存储过程值得付出努力,除非你想成为更好的并返回类似TimeSpan的行。

答案 1 :(得分:1)

select 70/60 + ( 70 % 60)/100.0

答案 2 :(得分:0)

我花了一些时间尝试做同样的事情,继承人我是怎么做到的:

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 :(得分:0)

CAST(Duration/60 + (duration % 60) /100.0 as Decimal(10,1))

答案 4 :(得分:-2)

在SQL Server 2012中:

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