SQL:浮点数转小时格式

发布于 2024-11-08 16:10:10 字数 174 浏览 0 评论 0原文

在 Ms SQL Server 2008 中是否有一种简单的方法来格式化以小时为单位的浮点数?

示例:

  • 1.5 -> 01:30
  • 9.8 --> 09:48
  • 35.25 --> 35:15

非常感谢。

Is there a easy way to format a float number in hours in Ms SQL server 2008?

Examples:

  • 1.5 -> 01:30
  • 9.8 -> 09:48
  • 35.25 -> 35:15

Thanks a lot.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

你曾走过我的故事 2024-11-15 16:10:10

我喜欢这个问题!

DECLARE @input float = 1.5;

DECLARE @hour int = FLOOR(@input);
DECLARE @minutes int = (SELECT (@input - FLOOR(@input)) * 60);

SELECT RIGHT('00' + CONVERT(varchar(2), @hour), 2) + ':' + RIGHT('00' + CONVERT(varchar(2), @minutes), 2);

I like this question!

DECLARE @input float = 1.5;

DECLARE @hour int = FLOOR(@input);
DECLARE @minutes int = (SELECT (@input - FLOOR(@input)) * 60);

SELECT RIGHT('00' + CONVERT(varchar(2), @hour), 2) + ':' + RIGHT('00' + CONVERT(varchar(2), @minutes), 2);
真心难拥有 2024-11-15 16:10:10
SELECT SUBSTRING(CONVERT(NVARCHAR, DATEADD(MINUTE, 1.5*60, ''), 108), 1, 5)

其工作原理如下:

  • 从“零”日期开始

  • 添加 1.5 x 60 分钟(即 1.5 小时)

  • 将结果格式化为时间,hh:mm:ss(即格式“108”)

  • 修剪秒数部分

有必要使用 1.5 x 60 分钟而不是 1.5 小时,因为 DATEADD 函数会将偏移量截断为最接近的整数。如果您想要高分辨率偏移,您可以使用 SECOND 来代替,适当的缩放(例如小时 * 60 * 60)。

SELECT SUBSTRING(CONVERT(NVARCHAR, DATEADD(MINUTE, 1.5*60, ''), 108), 1, 5)

This works by:

  • starting from the "zero" date

  • adding 1.5 x 60 minutes (i.e. 1.5 hours)

  • formatting the result as a time, hh:mm:ss (i.e. format "108")

  • trimming off the seconds part

It is necessary to use 1.5 x 60 minutes instead of 1.5 hours as the DATEADD function truncates the offset to the nearest integer. If you want high-resolution offsets, you can use SECOND instead, suitable scaled (e.g. hours * 60 * 60).

花间憩 2024-11-15 16:10:10

当然。简单,但不完全...直接:

declare @hours float 
set     @hours = -9.8

select substring('-  ',2+convert(int,sign(@hours)),1)                                        -- sign
     + right('00' + convert(varchar,                       floor(abs(@hours)))         , 2 ) -- hours component
     + ':'                                                                                   -- delimiter
     + right('00' + convert(varchar,round( 60*(abs(@hours)-floor(abs(@hours))) , 0 ) ) , 2 ) -- minutes

另一个可以给出正确结果的选项。您可能需要将其调整为四舍五入分钟并确保两个字段都是 2 位数宽。

declare @hours float 
set     @hours = -9.8

select       convert(varchar, datediff(minute,dateadd(minute,@hours*60,convert(datetime,'')),'') / 60 )
     + ':' + convert(varchar, datediff(minute,dateadd(minute,@hours*60,convert(datetime,'')),'') % 60 ) 

Sure. Easy, but not exactly...straightforward:

declare @hours float 
set     @hours = -9.8

select substring('-  ',2+convert(int,sign(@hours)),1)                                        -- sign
     + right('00' + convert(varchar,                       floor(abs(@hours)))         , 2 ) -- hours component
     + ':'                                                                                   -- delimiter
     + right('00' + convert(varchar,round( 60*(abs(@hours)-floor(abs(@hours))) , 0 ) ) , 2 ) -- minutes

Another option that will give the correct result. You might need to tweak it to round minutes and to ensure that both fields are 2 digits wide.

declare @hours float 
set     @hours = -9.8

select       convert(varchar, datediff(minute,dateadd(minute,@hours*60,convert(datetime,'')),'') / 60 )
     + ':' + convert(varchar, datediff(minute,dateadd(minute,@hours*60,convert(datetime,'')),'') % 60 ) 
夜未央樱花落 2024-11-15 16:10:10
WITH m AS
  SELECT Minutes = CAST(@hours * 60 AS int)
)
SELECT CAST(Minutes / 60 AS varchar) + ':' + RIGHT(100 + Minutes % 60, 2)
FROM m
WITH m AS
  SELECT Minutes = CAST(@hours * 60 AS int)
)
SELECT CAST(Minutes / 60 AS varchar) + ':' + RIGHT(100 + Minutes % 60, 2)
FROM m
三寸金莲 2024-11-15 16:10:10
select dateadd(MINUTE, cast((8.18 % 1) * 60 as int), dateadd(hour, cast(8.18 as int), convert(varchar(10), getdate(), 10)))
select dateadd(MINUTE, cast((8.18 % 1) * 60 as int), dateadd(hour, cast(8.18 as int), convert(varchar(10), getdate(), 10)))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文