2016-01-27 46 views
0

我真的可以使用一些幫助,根據SQL Date字段查詢數據時遇到問題。當從Web API服務器查詢linq時,數據庫混亂時的UTC

我使用下面的代碼存儲在UTC格式的日期:

objFitCalendarDto.Day = objFitCalendarDto.Day.ToUniversalTime(); 

該行分配日期插入到通過實體框架的數據庫模型。

現在,我的查詢應該檢索基於日期的行。所以,我應該能夠得到今天,明天,昨天等等的排。

要做到這一點,我使用的方法兩個日期,開始日期和結束日期之間的搜索如下:

DateTime dayBegin = DateTime.Today.Date.AddDays(dayOffset); 
DateTime dayEnd = DateTime.Today.Date.AddDays(dayOffset + 1); 

dayOffset的目的是指定日期。如果偏移量爲0,那麼我正在搜索今天。如果dayOffset爲1,那麼我正在搜索包含明天日期的行。

現在,因爲我原先存儲的數據是UTC,所以我假設我必須以UTC來搜索它。因此,在執行我的查詢之前,我將日期轉換爲UTC像這樣:

dayBegin = TimeZoneInfo.ConvertTimeToUtc(dayBegin); 
dayEnd = TimeZoneInfo.ConvertTimeToUtc(dayEnd); 

然後我執行我的查詢,像這樣:

var query = (from f in Db.FitCalendars 
    where f.FitProgramId == programId && 
      f.DayAsDate >= dayBegin && f.DayAsDate < dayEnd 
      select f); 

問題是,這是行不通的。當我在SQL Manager中查看日期時,我有一行「2016-01-26」。但是,它僅從昨天的日期查詢返回。順便說一句,今天是2016-01-26。很明顯,我沒有得到這個UTC概念。任何人都可以看到我在這裏做錯了嗎?我假設如果我將所有內容都存儲爲UTC,然後在查詢之前將查詢的日期轉換爲UTC,那麼一切都應該正常工作。

+0

嘗試manipualte'HttpConfiguration.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling'如果這是在網絡API – abatishchev

回答

1

UPDATE 讓我們試試這樣:

  1. 只要你是隻存儲日期部分(SQL「日期」型),你需要 也只比較日期。

  2. 而不是

DateTime dayBegin = DateTime.Today.Date.AddDays(dayOffset); 
dayBegin = TimeZoneInfo.ConvertTimeToUtc(dayBegin); 

我們只是做

DateTime dayBegin = DateTime.UtcNow.Date.AddDays(dayOffset); 

dayBegin在這種情況下,將日期與時間反正(時間是12:00:00 AM )。這意味着,我們需要用DbFunctions截斷它。我們需要平等在這裏檢查。 UPDATE

var query = (from f in Db.FitCalendars 
    where f.FitProgramId == programId && 
      f.DayAsDate == DbFunctions.TruncateTime(dayBegin) 
      select f); 

最後,我認爲,問題是,你比較次的日期。就你而言,你只需要比較日期,據我瞭解。作爲解決方案 - 使用DbFunctions TruncateTime函數。它可以在linq查詢中使用 - 就像在你的代碼中一樣。

https://msdn.microsoft.com/en-us/library/system.data.entity.dbfunctions.truncatetime(v=vs.113).aspx

所以,完整的解決方案將是

var query = (from f in Db.FitCalendars 
    where f.FitProgramId == programId && 
      DbFunctions.TruncateTime(f.DayAsDate) >= DbFunctions.TruncateTime(dayBegin) && DbFunctions.TruncateTime(f.DayAsDate) < DbFunctions.TruncateTime(dayEnd) 
     select f); 
+0

謝爾蓋序列化問題, 感謝您的答覆。但是,這並沒有解決它。你認爲我可能需要弄清楚服務器在什麼時區,然後相應地在UTC時間加上/減去小時?如果是這樣,那麼如何編程計算出時區呢? – xgp

+0

更新了我的回答 – berliner

+0

謝爾蓋,你的最新迴應解決了我們的問題。非常感謝你的幫助! – xgp