2013-07-10 72 views
3

無效,我有以下表格:操作數的數據類型時間是增加操作符

    SHIFT 
---------------------------------------- 
| SHIFT_ID | SHIFT_TIME | SHIFT_DURATION | 
| -------------------------------------- | 
| 1  | 00:00:00 | 01:00:00  | 
| 2  | 01:00:00 | 01:00:00  | 
| 3  | 02:00:00 | 01:00:00  | 
---------------------------------------- 

這裏,SHIFT_TIMESHIFT_DURATIONTimeSpan類型。

現在,當我運行以下查詢:

var query = from c in SHIFT 
      where c.SHIFT_TIME + c.SHIFT_DURATION >= 
      new TimeSpan(DateTime.Now.Hour, 
         DateTime.Now.Minute, 
         DateTime.Now.Second) 
      select c; 

我得到以下錯誤:Operand data type time is invalid for add operator.

爲什麼會這樣?我怎樣才能繞過這個錯誤?

編輯:我試過同時使用.Add().CompareTo()無濟於事。

+0

您是否嘗試過使用時間跨度添加方法? http://msdn.microsoft.com/en-us/library/system.timespan.add.aspx –

+0

是的,但它也會引發相同的異常。 – Raptor

+0

你如何使用TimeSpan.Add?它應該像'c.SHIFT_TIME.Add(c.SHIFT_DURATION)' –

回答

3

我看到有幾個問題。

讓我們從這裏開始:

new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second) 

調用DateTime.Now多次是不是一個好主意。您正在讀取系統時鐘三次。此外,還有已是該確切目的的屬性,所以你可以這樣做:

DateTime.Now.TimeOfDay 

下一個問題是:

c.SHIFT_TIME + c.SHIFT_DURATION 

如果換擋時間爲11:00 PM,持續時間是2個小時,你可能預計凌晨1點,但你會得到25個小時。 (其實你會得到「1天1小時」。)所以,當你到一天中的某個時間(比如上午12:30),你可能會得到不同的結果比你期望的。

下一個問題是:

你沒有提到這一點,但它看起來像你實際使用LINQ到實體,實體框架的一部分,連接到SQL Server。 (我更新了你的標籤。)我可以說因爲你收到的錯誤信息實際上是一個SQL Server錯誤信息。您可以複製它在SQL Server Management Studio中是這樣的:

declare @t1 time, @t2 time 
set @t1 = '1:00' 
set @t2 = '1:00' 
print @t1 + @t2 

Msg 8117, Level 16, State 1, Line 4
Operand data type time is invalid for add operator.

雖然你可以在.net中添加兩個TimeSpan類型,你不能在SQL Server中添加兩個time類型。這是因爲time意味着代表一天的時間,而TimeSpan主要表示測量的時間長度。 (從技術上講,我上面提到的DateTime.TimeOfDay財產違背了TimeSpan型的設計目的,但它是允許的,因爲沒有Time型.NET。)

所以,當你在做你的原始查詢的列time類型加在一起,這是不允許的。 time類型的最大值爲23:59:59.9999999,因此無法獲得前面提到的25小時結果。

該怎麼辦?

要處理SQL查詢中的日期和時間,需要使用EntityFuntionsSqlFunctions類的方法。這些將轉換爲查詢中的SQL本機函數。

我相信這將做你正在尋找:

var query = from c in SHIFT 
      where EntityFunctions.AddMinutes(c.SHIFT_TIME, 
        EntityFunctions.DiffMinutes(TimeSpan.Zero, c.SHIFT_DURATION)) 
        >= DateTime.Now.TimeOfDay 
      select c; 

這將構建類似於下面的SQL查詢(假設它是1:00現在):

SELECT * FROM SHIFT WHERE DATEADD(minute, 
            DATEDIFF(minute, 0, SHIFT_DURATION), 
            SHIFT_TIME 
           ) >= '1:00' 

SQL Server將隱式地將time輸入類型轉換爲datetime,以便它可以與DATEADD函數一起使用。它還會將結果轉換回time類型,因此您可以將其與您提供給查詢的「現在」時間進行比較。

+0

這真是太棒了!現在這一切都非常有意義。謝謝! – Raptor

+2

沒問題。此外,請確保您瞭解比較時間而沒有日期的影響。當你午夜過去時,就像從零開始。如果這不是你想到的,那麼你會想把那個時間映射到一個特定的日期,並使用'datetime'比較來代替。 –

1

它不知道如何添加兩個時間段。從this site使用TimeSpan.Add()

然後使用TimeSpan.Compare()


你在幹什麼

var query = from c in SHIFT 
     where TimeSpan.Compare(c.SHIFT_TIME.Add(c.SHIFT_DURATION), 
       new TimeSpan(DateTime.Now.Hour, 
          DateTime.Now.Minute, 
          DateTime.Now.Second)).Equals(1) 
     select c; 

+0

它引發同樣的異常。 – Raptor

+0

是的,我只是複製並粘貼你的代碼片段:http://oi43.tinypic.com/2i8dqva.jpg – Raptor

相關問題