簡體   English   中英

操作數數據類型時間對於添加運算符無效

[英]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_TIMESHIFT_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查詢中操作日期和時間,需要使用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類型,因此您可以將其與您提供給查詢的“現在”時間進行比較。

它不知道如何添加兩個時間跨度。 從此站點使用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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM