【问题标题】:How do i convert minutes to represent hours decimally in sql?如何在sql中将分钟转换为十进制小时?
【发布时间】:2014-08-20 15:26:03
【问题描述】:

我有 分钟 140。小时和分钟变成 2:20。

在这种情况下,我很想得到 2.33。

我尝试过的:

select cast(140/60 as varchar(8)) + '.' + cast((140 % 60) as varchar(8))

输出:2.20

select 140/60

输出:2

select cast(140/60 as decimal(5,2))

输出:2.00

我错过了什么?

如何将 140 分钟转换为十进制小时数?

【问题讨论】:

  • 你也应该将 140 和 60 转换为浮点数,选择 cast(140 as float) / cast(60 as float)
  • select case(140/60 as decimal(5,2)) 返回2.33 对我来说很好......
  • @hoangnnm 谢谢,成功了!选择 cast(cast(140 as float) / cast(60 as float) as decimal(5,2))
  • 60 不需要浮动,试试下面的代码
  • 而你没有直接得到的原因是它采用了分子数据类型。您可以尝试第二个查询,而无需将任何数字转换为浮点数。

标签: sql time casting


【解决方案1】:

对于快速评论感到抱歉,我会尝试更清楚地解释这一点。

默认情况下,Sql 会“认为”你的除数和除数都是 INT 数据类型,这就是它返回 2 的原因。

如果你用小数指定数字,像这样:

select (140.00/60.00)

现在数据类型不再是int,结果是:2.3333333

因此,您需要将其中一种数据类型转换为浮点、小数、数字(n,n)以获得准确的结果:

select cast(140 as decimal(5, 2)) / cast(60 as decimal(5, 2)) 

但您仍然可以只转换除数或除数,如下所示:

select 140 / cast(60 as decimal(5, 2)) 

select cast(140 as decimal(5, 2)) / 60

它们都给出了相同的结果,因为结果类型是具有更高优先级的参数的数据类型,在这种情况下,十进制的优先级高于 int

你可以在这里阅读更多:

【讨论】:

    【解决方案2】:

    试试这个

    Select convert(decimal(5,2),convert(float,140)/60)
    

    Select cast(140.00/60 as decimal(5,2))
    

    【讨论】:

    • 你为什么转换成float,然后转换成decimal?当然两者都应该是decimal
    • 这是一个不同的问题。由于数据类型的优先顺序,convert(float,140)/60 隐式 导致将60 转换为float。美好的。但是为什么要将140 转换为float,然后将结果转换为decimal?我完全看不到使用float 的目的。为什么不简单地使用CAST(140 as DECIMAL(5,2)) / 60?在intfloatdecimal 之间切换似乎明显不一致。
    • CAST(140 as DECIMAL(5,2)) / 60 我相信结果是 2.333333 而不是 2.33。你能验证自己并理解你提供的信息吗? 140 转换为 float 或 decilam 然后 / 60 给出 2.333333 再次需要转换为 decimal(5,2)
    猜你喜欢
    • 2021-08-19
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多