是否有一种简洁的格式化整数的方法,它是一个整数分钟的计数,分为小时和分钟的十进制表示。很遗憾T-SQL中没有Timespan这样的东西来支持这一点。
为了清楚我的意思是,如果我有70分钟,我想把它转换成1小时10分钟的表示,即1.10
。我还想将它保存为varchar或其他东西,以确保尾随零保持不变。
无论如何,这可以在SQL中创建为自定义函数,以便可以从不同的查询中重用它吗?
答案 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')