2014-01-30 147 views
0

我正在嘗試僅比較日期。表中的值是DateTime,格式爲 2014-01-29 09:00:00.000。請指教謝謝Linq比較2日期

public static List<vwReportDate> GetDetail(string startDate, string endDate) 
{ 
    startDate = "2014-01-28"; 
    endDate = "2014-01-28"; 

    DateTime dtStart = Convert.ToDateTime(startDate); 
    DateTime dtEndDate = Convert.ToDateTime(endDate); 


    var entities = new DataEntiies(); 
    var query = from c in entities.vwReportDate 
       where c.EventCreateDate >= dtStart && c.EventCreateDate <= dtEndDate 
       select c; 
    return query.ToList(); 

} 
+1

使用'Date'屬性。 – Styxxy

+0

我注意到你暗示你正在查詢一張桌子。你正在使用哪種ORM工具?實體框架?你能否更新你的問題中的標籤來反映這一點? – Sam

+0

「格式爲[...]的DateTime」 - 沒有這種東西。 DateTime只是一個值;它本身並不具有格式。 –

回答

3

它看起來像你使用實體框架和LINQ到EF。如果這是真的,則不能在LINQ to EF中使用DateTime.Date屬性because it's not supported。你必須使用,而不是EntityFunctions.TruncateTime(myDateTime)靜態方法:

var query = from c in entities.vwReportDate 
      let eventDate = EntityFunctions.TruncateTime(c.EventCreateDate) 
      where eventDate >= dtStart && eventDate <= dtEndDate 
      select c; 
0

使用DateTime結構檢索「日期」部分的Date財產。

獲取此實例的日期組件。

使用它的代碼:

var query = from c in entities.vwReportDate 
      where c.EventCreateDate.Date >= dtStart && c.EventCreateDate.Date <= dtEndDate 
      select c; 

如果您正在使用實體框架(因爲它看起來像你這樣做),你必須使用EntityFunctions.TruncateTime(助手)的方法,因爲否則查詢無法轉換。

var query = from c in entities.vwReportDate 
      where EntityFunctions.TruncateTime(c.EventCreateDate) >= dtStart && EntityFunctions.TruncateTime(c.EventCreateDate) <= dtEndDate 
      select c; 
2

我的辦法解決這個問題,它不依賴於EF,就是用「小於」的日期範圍的結束(移動的結束後,日期範圍下一天):

startDate = "2014-01-28"; 
endDate = "2014-01-28"; 

DateTime dtStart = Convert.ToDateTime(startDate); 
DateTime dtEndDate = Convert.ToDateTime(endDate).AddDays(1); 


var entities = new DataEntiies(); 
var query = from c in entities.vwReportDate 
      where c.EventCreateDate >= dtStart && c.EventCreateDate < dtEndDate 
      select c; 
return query.ToList(); 

問:爲什麼你忽略方法的調用者提供的參數值?

+0

如果他/她想要查詢包含*等於*結束日期的值,該怎麼辦?該查詢表明這是所需的行爲。我不認爲這在功能上是等同的。 – Sam

+0

@Sam:請注意我添加了一個到結束日期。如果用戶輸入日期範圍2013-01-01至2013-12-31,則OP的標準包括日期/時間值(例如2013-12-31 01:00:00),方法是截斷數據庫值的時間。我的方法是將範圍末尾的值加1,並將運算符從'<='更改爲'<',所以它也包含1 A.M.值。爲了真正等價,兩種方法都需要截斷範圍值,但由於這些在示例中只是純日期常量,所以我從我的答案中省略了這一點。不過,爲什麼我問了有關方法參數的問題。 – phoog

+0

對不起,我可以看出你是對的。我沒有注意到'AddDays'位,因爲你只改變了你提到的改變的改變,你改變了比較運算符,這本來就是不正確的。 – Sam