0

我有一些数据库值存储休息的开始时间及其持续时间,但时间值存储为小数。举个例子

12.45 = 12:45 PM
12:59 = 12:45 PM
13.0  = 13:00 PM

持续时间存储为 int;30 = 30 分钟

在这里我必须检查特定时间是否在范围之间,所以我使用了 C# 和实体框架,并且我使用了以下代码,但它给出了一个错误,即 DateTime.Parse 无法被 LINQ 识别。

STAR_TIME 是存储为 12.45 的时间,DURATION 存储为 30,timeE 是日期时间类型

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

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

4

1 回答 1

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;这给出了相同的结果。如果你有 IF(意思是整数 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。

是的,这是一项艰苦的工作。但那是因为使用的表示确实不适合手头的任务。

于 2012-08-28T07:16:38.543 回答