6

中執行日期 - 部分比較我聽說有人說日期時間比較因爲時間部分不起作用,因爲日期時間有時間部分。如何在EF

在SQL

我一直比較喜歡的datetime這種方式,它工作正常

select * from employee 
where convert(varchar,dob,112) > '20111201' // this yyyymmdd format. 

我怎麼能在LINQ查詢模擬這個?

+1

你的意思是實體框架(= LINQ to Entities)和LINQ to SQL(前EF ORM)? – abatishchev

+1

FWIW,如果您使用的是SQL Server 2008或更高版本,那麼對於時間部分無關的字段,您可能應該使用'Date'(而不是'DateTime')(您不可能真的擁有某個人的時間出生了,更不可能對你有意義)。當'Date'可用時,使用'DateTime'並且您不關心時間就像將所有數字數據存儲在'float'中一樣,而不管數據是否固有地不可分割。 –

回答

2

要記住的一件事是,對錶示數據庫列的DateTime結構上的操作不會轉換爲SQL。所以,你不能寫這樣的查詢:

from e in EfEmployeeContext 
where e.DOB.Date > new DateTime(2011,12,01); 

...因爲e.DOB表示數據庫中的DOB列,EF將不知道如何將日期子屬性轉換。

但是,這取決於你想要什麼日期簡單的解決方法是:

  • 如果要包括對12/01/2011一個DOB以及那些在該日期之後出生的所有員工,然後只需查詢:

    from e in EfEmployeeContext 
    where e.DOB > new DateTime(2011,12,01); 
    
  • 如果你想只包括12/01/2011以後出生的員工,然後查詢:

    from e in EfEmployeeContext 
    where e.DOB >= new DateTime(2011,12,02); 
    

簡而言之,您可以設置標準,這意味着您正在比較的常量或文字DateTime可以設置。您不能對錶示where謂詞內的DB列的屬性進行徹底修改。這意味着你不能在一個時間列的數據進行比較DateTime列的投影,例如:

//get all employees that were hired in the first six months of the year 
    from e in EfEmployeeContext 
    where e.HireDate < new DateTime(e.HireDate.Year, 7, 1); 
+0

從EfEmployeeContext中執行此代碼 其中e.DOB> new DateTime(2011,12,01);因爲美國的日期格式與英國有所不同,因此在所有文化中工作。 – Thomas

+0

DateTime的構造函數總是先採用年份,然後是月份,然後採用日期,而不管可能用於將其顯示爲字符串的文化。 – KeithS

10

如果您使用.NET 4或以上,只需使用EntityFunctions.TruncateTime的輔助方法。這會將這種類型的datetime-to-date轉換轉換爲SQL。

from e in EfEmployeeContext 
where EntityFunctions.TruncateTime(e.DOB) > new DateTime(2011,12,01); 
+0

如果我使用linq 2 sql那麼我該如何工作? – Thomas

+3

如果你使用'LINQ to SQL',那麼我會將標籤移除到'EntityFramework'和'linq-to-entities',以及你問題標題中對EF的引用。使用LINQ to SQL意味着你的問題變得無關緊要。 – mclark1129

+0

當人們使用LINQ to SQL時,日期比較不能存在嗎? – Thomas