2016-04-13 5 views
0

データベース用のAzure SQL Serverのインスタンスを持つAzure AppサービスでMVCコアWebアプリケーションを実行しています。Entity Framework + Azure、ウェブアプリケーションと異なるタイムゾーンにあるデータベース

私はAzure Portalを使ってAppサービスのタイムゾーンをCESTに変更しました.CESTは現在GMT + 2です。

データベースは北ヨーロッパのAzureにありますが、データベースのタイムゾーンがわかりませんが、GMTやBritish Summer Timeの可能性が最も高いです。

私の日付は単純なdatetime2値として保存されます。つまり、TimeZone情報がありません。これは、データベース上の(メモリではなく)日付を比較するクエリを実行するたびに、クエリが不正な結果を返すことを意味します。

私はEntity Framework Core(7)を使用してデータベースからクエリを実行しています。

過去のイベントを返すことになっているクエリの例が、最後の2時間からのイベントは含まれません。これを引き起こしている正確に何

private IOrderedQueryable<Event> GetPastEvents() 
    { 
     var result = _dbContext.Events 
      .Where(t => t.DateTime < DateTime.Now) 
      .OrderByDescending(e => e.DateTime); 
     return result; 
    } 

を? これに対処する最も良い方法は何ですか?

+0

アプリケーションコードとSQ​​Lクエリがないと手助けできません。何が問題を引き起こしていますか?なぜデータベースの*時間*は保存された値に関係しますか?おそらくアプリケーションとデータベースのローカルとUTC時間を混在させていますか?実際の修正はもちろん、データベース*および*アプリケーションでDateTimeOffsetを使用することです。 ** ** UTC時刻のみを保存し、SQLでUTC関数を呼び出します。 'GETDATE()'の代わりに 'GETUTCDATE()'を使います。 –

+0

これは、UnicodeとANSIの質問との違いは何もありません。実際のソリューションは、Unicodeを使用することです。バグの回避策は、コード・ページを修正して、*これがある時点で破損するかどうかを知ることです。 –

+0

あなたの返事をありがとう、私はうまくいってもっと明確に質問を編集しました。 私の推測では、UTC時間と現地時間を混在させていますが、どういうことかはっきりしています。私の最初の考えは、データベースのタイムゾーンを変更することが早急に解決されるということでした。それは可能ですか?理想的には私はUTC時代を保存して作業することになりますが、データモデルを変更してコードを変換してデータを変換する必要があるため、より簡単な回避策を使用することをお勧めします。 – severin

答えて

0

修正はかなり簡単でした。 LINQのツーエンティティクエリにそれを置く前にメモリに現在の時間を節約:

var now = DateTime.Now; 
return _dbContext.Events.Where(t => t.DateTime < now) 

私の最初のクエリは、もちろん上の現在のUTC時刻に評価され、DateTime.Nowの代わりにGetDate()を使用するSQLクエリを生成データベース。

私のデータはタイムゾーンを完全に認識していないため、この問題はかなりうまく解決します。

関連する問題