![](/img/trans.png)
[英]How to resolve operand data type nvarchar is invalid for minus operator
[英]Operand data type time is invalid for add operator
我有下表:
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_TIME和SHIFT_DURATION屬於TimeSpan
類型。
現在,當我運行以下查詢時:
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()
都無濟於事。
我看到一些問題。
我們從這里開始:
new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second)
多次調用DateTime.Now
永遠不是一個好主意。 你正在讀三次系統時鍾。 此外,還有一個用於此目的的屬性,因此您可以這樣做:
DateTime.Now.TimeOfDay
下一個問題:
c.SHIFT_TIME + c.SHIFT_DURATION
如果換班時間是晚上11點,持續時間是2小時,你可能會期待凌晨1點,但相反,你將獲得25個小時。 (實際上你會得到“1天1小時”。)所以當你到達一天中的某個時間(例如12:30)時,你可能得到的結果與你預期的不同。
下一個問題:
您沒有提到這一點,但看起來您實際上使用的是作為Entity Framework一部分的LINQ-to-Entities連接到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
操作數數據類型時間對於添加運算符無效。
雖然您可以在.Net中添加兩個TimeSpan
類型,但您無法在SQL Server中添加兩種time
類型。 這是因為time
意味着代表一天中的時間,而TimeSpan
主要代表測量的時間長度。 (從技術上講,我上面提到的DateTime.TimeOfDay
屬性違反了TimeSpan
類型的設計目的,但它是允許的,因為.Net中沒有Time
類型。)
因此,當您執行原始查詢時, 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
類型,因此您可以將其與您提供給查詢的“現在”時間進行比較。
它不知道如何添加兩個時間跨度。 從此站點使用TimeSpan.Add()
你在做什么
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;
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.