我有一些数据库值存储中断的开始时间及其持续时间,但时间值存储为小数。对于一个实例
12.45 = 12:45 PM
12:59 = 12:45 PM
13.0 = 13:00 PM
持续时间存储为int; 30 = 30分钟
这里我必须检查特定时间是否在范围之间,所以我使用了C#和Entity Framework,并且我使用了以下代码,但它给出了一个错误,即LINQ无法识别DateTime.Parse。 / p>
STAR_TIME是存储为12.45和的时间 DURATION存储为30 和timE是日期时间类型
meal ml = HRM.meals.SingleOrDefault(p => p.SHIFTCODE == ShiftCode
&& DateTime.Parse(p.STAR_TIME.ToString().Replace(".", ":")) <= timE
&& DateTime.Parse(p.STAR_TIME.ToString().Replace(".", ":")).AddMinutes(int.Parse(p.DURATION.ToString())) >= timE
);
然后我没有转换,而是尝试乘以60并尝试比较下面的值,但其逻辑是错误的。 这里使用12.59作为时间
meal ml = HRM.meals.SingleOrDefault(p => p.SHIFTCODE == ShiftCode
&& p.STAR_TIME*60 <= new Decimal(12.59)*60
&& p.STAR_TIME*60 + p.DURATION >= new Decimal(12.59) * 60
);
STAR_TIME - 12.45 * 60 - 747 持续时间 - 30 结束时间 - 747+ 30 = 777
但实际上结束时间应该是13.15, 13.15 * 60 - 789
有人可以建议任何方法来解决这种情况吗?
答案 0 :(得分:2)
使用小数来表示时间会让生活变得艰难。简单地乘以60不会在几小时和几分钟内给出答案。例如,考虑:0.02 * 60.作为小数,它给出值1.20。但是,这应该是2分钟,而不是1.20分钟。
您可能需要从整数中拆分分数。我们考虑2.03(凌晨2:03)。将整数乘以60;这是从午夜开始的120分钟。将0.03乘以60;那给你1.80;除以0.60(因为60分钟由分数0.60表示),你得到3,所以总时间是从午夜起123分钟。当然,你可以简单地将分数乘以100;这给出了相同的结果。如果你有I.F(意思是整数I和分数F),你可以获得自午夜起的总分钟数(60 * I + 100 * F)。
现在假设你也有间隔V.这是一个整数分钟。
假设:
I = 12
F = 0.45
V = 30
您想要I.F + V
的值作为时间。
M = 60 * I + 100 * F + V
M = 720 + 45 + 30
M = 795
自午夜以来要回到答案H.M
,您需要将M / 60除以得到H,然后取余数M%60并除以100得到分数:
H = 795 / 60 = 13
M = (795 % 60) / 100 = 15 / 100 = 0.15
因此,答案是H + M = 13.15
或下午13:15。
是的,这很辛苦。但那是因为所使用的表示形式实际上不适合手头的任务。