实体框架中的十进制日期时间转换和比较

时间:2012-08-28 04:57:49

标签: entity-framework datetime decimal

我有一些数据库值存储中断的开始时间及其持续时间,但时间值存储为小数。对于一个实例

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

有人可以建议任何方法来解决这种情况吗?

1 个答案:

答案 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。

是的,这很辛苦。但那是因为所使用的表示形式实际上不适合手头的任务。

相关问题