0

休憩の開始時刻とその期間を格納するデータベース値がいくつかありますが、Time値はDecimalsとして格納されています。たとえば

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

期間はintとして保存されます。30=30分

ここでは、特定の時間が範囲内にあるかどうかを確認する必要があるため、C#とEntity Frameworkを使用し、次のコードを使用しましたが、DateTime.ParseをLINQで識別できないというエラーが発生します。

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 DURATION-30 END TIME-747+ 30 = 777

ただし、実際の終了時間は13.15、13.15*60-789である必要があります

誰かがこの状況に取り組むための方法を提案できますか?

4

1 に答える 1

2

時間を表すために小数を使用すると、人生が困難になります。60を掛けるだけでは、数時間と数分で答えが得られるわけではありません。たとえば、次のことを考慮してください。0.02 *60。小数として、値は1.20になります。ただし、1.20分ではなく、2分にする必要があります。

おそらく整数から分数を分割する必要があります。2.03(2:03 AM)について考えてみましょう。整数に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.MM / 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 に答える