2017-04-18 27 views
1
var onLineP = (from od in db.RTLS_ONLINEPERSONSTATUS 
       where (lsdAts <= od.created_time && od.created_time <= DateTime.Now) 
       select od).ToList(); 

上記のクエリでは、前日のレコードを取得していますが、現在の日付は取得していません。私はバックエンドとして私のormとazure-sqlとしてEntityフレームワークを使用しています。 RTLS_ONLINEPERSONSTATUSテーブルにはの時間が4/17/2017 10:00:09 AM、4/18/2017 10:00:09 AMとそれぞれ作成された2つのレコードがあります。私は= 2017年4月17日午前10時00分09秒AMなく現在の日(2017年4月18日午前10時00分09秒AM)レコードを取得作成時間の値を持つレコードを取得しています。 lsdAts(サーバーの最終同期日)= {4/6/2017 10:34:09 AM}Entity Framework:Linq where節日時の値と秒の差を比較します。

+0

lsdAtsとは何ですか? –

+1

'DateTime.Now'を表示して、同じタイムゾーンの時間を比較するようにします。 – KernelMode

+0

lsdAts(サーバーでの最終同期日)= {4/6/2017 10:34:09 AM} –

答えて

0

最後に私は私の問題の解決策を得ました。隠された問題は、私のSQLサーバが南のAciaにあり、インド南部からアクセスしているので、LinqがDatetime.NowをSysDateTime()に変換するのでタイムゾーンが不一致です。これを克服するために、以下のコードスニペットに示すように、Datetime.Nowに330分(つまり5時間30分)を追加しました。

var onLineP = (from od in db.RTLS_ONLINEPERSONSTATUS 
       where (lsdAts <= od.created_time && od.created_time <= DbFunctions.AddMinutes(DateTime.Now, 330)) 
              select od).ToList(); 
+0

夏時間がまったく同じ日に開始して終了しない場合、これは失敗します。私は彼らがいないと思う、あなたは異なった半球にいる。 – zmbq

+0

ええ、私のシステムがインドでのみ運用されるので、私の要求に従って、それが正確に失敗するとき、それは十分です。しかし、私は時間を扱う際のベストプラクティスを知る必要があります。 –

0

前述のように、タイムゾーンの違いに関連しています。時間を比較する場合にのみUTCを使用することをお勧めします。また、UTCでデータベースに時刻を保持することも意味します。最終的にコードは次のようになります。

var onLineP = (from od in db.RTLS_ONLINEPERSONSTATUS 
    where (lsdAts <= od.created_time_utc && od.created_time_utc <= DateTime.Now.ToUniversalTime()) 
    select od).ToList(); 
関連する問題