我不確定我的問題標題是完美的 - 所以請允許我進一步解釋一下。DbFunctions.TruncateTime在不同服務器時區的行爲有所不同嗎?
下面是一些測試數據的快照:
這裏是我的代碼:
Function TestDb() As ActionResult
Dim clientLocId As Integer = 23
Dim showDate As New Date
showDate = New Date(2015, 8, 14)
'showDate = New Date(2015, 9, 22)
'showDate = New Date(2015, 9, 27)
Dim orderRecs = db.Orders.Where(Function(x) x.ClientLocationId = clientLocId AndAlso x.OrderNumber IsNot Nothing _
AndAlso x.DateCompletedUtc IsNot Nothing _
AndAlso DbFunctions.TruncateTime(x.OrderDateLoc) = showDate.Date) _
.OrderByDescending(Function(x) x.OrderDateUtc)
Stop
End Function
所以這裏是我的問題:
訂單日期2015年9月27日和2015年9月22日的行使用上述邏輯進行正確查詢 - 每個請求的日期產生1行。但 - 對08/14/2015日期的查詢不會產生任何結果。我現在正處於-04:00時區,如果這很重要的話。如果我將行數據 [end edit]中的時區[編輯] 更改爲-04:00,則2015年2月8日的行正確查詢。
我試圖找到答案,但已經幹了。有人可以權衡我的問題嗎?
[更新]:解決方法 這是一個被@PiotrAuguscik建議將查詢轉換到一個列表基於從this thread的建議解決方法(現在):
Dim orderRecs = (db.Orders.Where(Function(x) x.ClientLocationId = clientLocId AndAlso x.OrderNumber IsNot Nothing _
AndAlso x.DateCompletedUtc IsNot Nothing).ToList) _
.Where(Function(x) x.OrderDateLoc.Value.Date = showDate.Date) _
.OrderByDescending(Function(x) x.OrderDateUtc)
這是一個一點「硬皮」,但它的作品。然而,我確實想知道爲什麼時區與DbFunctions.TruncateTime()有關。
[更新#2]答案馬特 - 約翰遜
Dim orderRecs = db.Orders.Where(Function(x) x.ClientLocationId = clientLocId AndAlso x.OrderNumber IsNot Nothing _
AndAlso x.DateCompletedUtc IsNot Nothing AndAlso
(x.OrderDateLoc >= showDateDto AndAlso x.OrderDateLoc < showDateDto.AddDays(1))) _
.OrderByDescending(Function(x) x.OrderDateUtc)
如何放置斷點並查看DbFunctions.TruncateTime(x.OrderDateLoc)返回的內容? –
@ZoffDino - 感謝您的回覆。由於DbFunctions()函數只能出現在一個LINQ to Entities查詢中,所以我不知道除了我目前正在做的事情之外,我將如何做任何事情。請讓我知道,如果我嚴重忽略了這樣做的方式。 – HumbleBeginnings
如果您使用的是SQL Server,是否使用了Profiler工具來準確查看SQL執行的內容?我猜測所比較的實際值並不完全符合您的預期。有些東西可能正在根據時區進行更改。 – jmcilhinney