2012-08-28 74 views
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 和時間的時間被一個日期時間類型

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 結束時間 - 747+ 30 = 777

但實際上結束時間應13.15 , 13.15 * 60 - 789

有人建議可以應付這一局面的任何方法?

+0

有很可能是一招(還在想着它),但真正的答案永遠是:時間值存儲爲小數=>不!將它們存儲爲...時間值(TIME,DATETIME或任何適合的值,但不是小數)! –

+0

是的,事情是即將集成新的模塊與現有的軟件,所以在該數據庫日期時間存儲在這個怪異的方式。 我以實體框架,我不能做轉換到12.45 12:45字符串,並將其解析在C#datetime或時間跨度,但在這裏,因爲即時通訊前解決它:S –

+0

應該在價值觀的第一個表格的第二行寫着: '12.59 = 12:59 PM'? –

回答

2

使用小數來表示時間,使生活困難。僅僅乘以60就不會在幾小時和幾分鐘內給出答案。例如,考慮:0.02 * 60.作爲一個小數,它給出值1.20。但是,這應該是2分鐘,而不是1.20分鐘。

你可能需要將一部分來自於整數分裂。讓我們考慮2.03(2:03 AM)。將整數乘以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 PM。

是的,這是艱苦的工作。但那是因爲所使用的表示方式實際上不適合手頭的任務。

+0

非常感謝隊友,我通過改變代碼如下... 餐毫升= HRM.meals.SingleOrDefault(p值=> p.SHIFTCODE做到了== ShiftCode &&((p.STAR_TIME - (p.STAR_TIME%1))+((p.STAR_TIME%1)* 10/6))<=直流 &&((p.STAR_TIME - (p.STAR_TIME%1) )+((p.STAR_TIME%1)* 10/6)+((十進制)p.DURATION/60))= dc –