2013-11-26 131 views
1

我有一个查询,但它没有给出正确的答案。我想显示像这样5小时58分钟+7小时58分钟= 13小时56分钟(答案应该是13.56),但下面的查询给出输出13.6。 请回复我的任何其他解决方案。 (Effort1为5小时列,Effort1Minutes为58分钟列和相同Effort2是7小时列,Effort2Minutes 58分钟列。分钟超过60分钟的小时数和分钟数总和

select SUM(Effort1 + Effort2) + SUM(Effort1Minutes + Effort2Minutes)/60 + CONVERT(decimal(18,2), (SUM(Effort1Minutes + Effort2Minutes) % 60)/100.00) 
from TimesheetDetails 

回答

2

当你有一个锤子,所有问题看起来都像钉子。这是一种常见的你为什么要使用这样一个令人费解的查询来计算时间的总和陷阱,这基本上意味着“用每个给定的问题正确的工具”。

  1. 你为什么不有两种TIME列,稍后可以使用ADDDATE(d1, d2)

  2. 为什么不使用SQL 99标准中定义的TIME INTERVAL数据类型?

  3. 为什么不在几分钟内返回结果,并让应用程序将其转换为您选择的格式?

  4. 为什么不单独返回小时和分钟,并再次让应用程序处理分钟总和可能产生的额外小时?

正如你所看到的,还有很多其他的解决方案可以从根本上解决你的问题,同时也给你一个更好的数据库设计。请考虑他们,特别是头号。

+0

尽管使用'time'列可能会得到,但它仍然不是正确的数据类型。 “时间”意味着代表一天的时间 - 而不是时间间隔。并且,鉴于OP正在执行这些值的增加,它表明它们意味着间隔。 –

+0

如果你想要非常贴近类型的意义,你可以随时记录'Time1Start''Time1End'等等,但无论如何我没有提供具体的解决方案,而只是一个读者关于提高他/她的思想练习数据库 –

+0

这个问题更多的是与例如'时间'不能容纳超过24小时的时间 - 这个时间间隔的总和很容易超过。 –