我看到有幾個問題。
讓我們從這裏開始:
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查詢中的日期和時間,需要使用EntityFuntions
或SqlFunctions
類的方法。這些將轉換爲查詢中的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
類型,因此您可以將其與您提供給查詢的「現在」時間進行比較。
您是否嘗試過使用時間跨度添加方法? http://msdn.microsoft.com/en-us/library/system.timespan.add.aspx –
是的,但它也會引發相同的異常。 – Raptor
你如何使用TimeSpan.Add?它應該像'c.SHIFT_TIME.Add(c.SHIFT_DURATION)' –