C# 如何从另一个hh.mm格式时间(十进制)中减去一个hh.mm格式时间?
我在一个SQL数据库中有4条记录。它有两个柱小时1和小时2C# 如何从另一个hh.mm格式时间(十进制)中减去一个hh.mm格式时间?,c#,sql,C#,Sql,我在一个SQL数据库中有4条记录。它有两个柱小时1和小时2 记录1:hours1-1.00,hours2-1.00 记录2:小时1-9.00,小时2-5.30 记录3:小时1-9.00,小时2-9.00 记录4:小时1-3.00,小时2-3.00 这里我得到了这些柱的总和: SUM of column1 : 22.00 SUM of column1 : 18.30 这些都是小数,但我认为是时间。< /P> 现在我想从第1列求和中减去第2列求和,即 22.00 - 18.30 因此,我将
- 记录1:hours1-1.00,hours2-1.00
- 记录2:小时1-9.00,小时2-5.30
- 记录3:小时1-9.00,小时2-9.00
- 记录4:小时1-3.00,小时2-3.00
SUM of column1 : 22.00
SUM of column1 : 18.30
这些都是小数,但我认为是时间。< /P>
现在我想从第1列求和中减去第2列求和,即
22.00 - 18.30
因此,我将得到3.7
,这是错误的,因为我认为这是一个时间
我想要的最终答案是:3.30(要求的理由:所以当我把这个结果加到18.30(18.30+3.30,即21.60=22.00小时,60分钟=1小时),我得到了总数22.00)
有人能帮我如何得到
3.30
吗?我不能使用TimeFormat。正如大家在评论中所说:需要转换,必须在求和之前完成
以下是如何:
var times1 = new decimal[] { 1.00m, 9.00m, 9.00m, 3.00m };
var times2 = new decimal[] { 1.00m, 5.30m, 9.00m, 3.00m };
var hours1 = ActualHours(times1).Sum(); // using System.Linq;
var hours2 = ActualHours(times2).Sum();
var diff = hours1 - hours2;
var result = "Actual: hours1 = " + hours1 +
", hours2 = " + hours2 +
", diff = " + diff + "\r\n" +
"Printed: hours1 = " + Print(hours1) +
", hours2 = " + Print(hours2) +
", diff = " + Print(diff);
使用的方法:
public IEnumerable<decimal> ActualHours(params decimal[] values)
{
foreach (var v in values)
{
var t = Math.Truncate(v);
yield return t + (v - t) / 0.6m;
}
}
public string Print(decimal v)
{
var t = Math.Truncate(v);
return (t + (v - t) * 0.6m).ToString("0.00");
}
正如每个人在评论中所说:转换是必要的,必须在求和之前完成 以下是如何:
var times1 = new decimal[] { 1.00m, 9.00m, 9.00m, 3.00m };
var times2 = new decimal[] { 1.00m, 5.30m, 9.00m, 3.00m };
var hours1 = ActualHours(times1).Sum(); // using System.Linq;
var hours2 = ActualHours(times2).Sum();
var diff = hours1 - hours2;
var result = "Actual: hours1 = " + hours1 +
", hours2 = " + hours2 +
", diff = " + diff + "\r\n" +
"Printed: hours1 = " + Print(hours1) +
", hours2 = " + Print(hours2) +
", diff = " + Print(diff);
使用的方法:
public IEnumerable<decimal> ActualHours(params decimal[] values)
{
foreach (var v in values)
{
var t = Math.Truncate(v);
yield return t + (v - t) / 0.6m;
}
}
public string Print(decimal v)
{
var t = Math.Truncate(v);
return (t + (v - t) * 0.6m).ToString("0.00");
}
如果要将时间存储为小数(不),则不要将30分钟存储为
.3
而是存储为.5
…要获取时间值,可以将小数转换为时间,然后进行计算,然后再转换回小数。然后先转换数据。您无法在错误的数字上进行预期正确结果的计算。没有应用程序太大而无法更改,只是意味着需要更长的时间。此外,由于懒惰的程序员,正确的结果比错误的结果要好。如果你不想更改数据,那么你就完蛋了。没有办法知道你的总和中3.0
的结果是2.0
+1.0
(三小时)还是0.3
+0.3
+0.3
+0.3
+0.3
+0.3
+0.3
0.3。。。(十个半小时,即五个小时)。如果您将时间存储为小数(不要),则不要将三十分钟存储为.3
,而是存储为.5
…要获取时间值,您可以将小数转换为时间,然后进行计算,然后再转换回小数。然后首先转换数据。您无法在错误的数字上进行预期正确结果的计算。没有应用程序太大而无法更改,只是意味着需要更长的时间。此外,由于懒惰的程序员,正确的结果比错误的结果要好。如果你不想更改数据,那么你就完蛋了。没有办法知道你的总和中3.0
的结果是2.0
+1.0
(三小时)还是0.3
+0.3
+0.3
+0.3
+0.3
+0.3
+0.3
0.3。。。(十个半小时,即五个小时)。你能解释一下实际小时()和打印()是如何工作的吗?到底是什么让人难以理解?你有没有试过调试和监控手表中的几个变量,这应该很清楚?我完全理解Peter B。首先我没有调试就尝试了。这就是为什么我有点困惑,但调试后我完全理解了。你能解释一下ActualHours()和Print()是如何工作的吗?到底是什么让我很难理解?你有没有试过调试和监控手表中的几个变量,这应该会让你明白吗?我完全理解Peter B。首先我没有调试就尝试了,这就是为什么我有点困惑的原因,但调试后我完全理解了。