LINQ to Entities + SQLite で下のようなクエリを使うと、
// 今やるべき予定 var plans = context.Plans.Where(w => w.StartAt <= DateTime.Now && DateTime.Now <= w.EndAt);
こんな SQL が発行されます。
SELECT [Project1].[C1] AS [C1], [Project1].[PlanId] AS [PlanId], [Project1].[Title] AS [Title], [Project1].[StartAt] AS [StartAt], [Project1].[EndAt] AS [EndAt] FROM [Plans] WHERE ([Project1].[StartAt] <= (STRFTIME('%Y-%m-%d %H:%M:%S', 'now'))) AND ((STRFTIME('%Y-%m-%d %H:%M:%S', 'now')) <= [Project1].[EndAt])
SQL を眺めると、 DateTime.Now
の部分は DB が処理するらしく、 C# の DateTime.Now
は
JST で処理されるのに、SQLite の STRFTIME
は UTC なので時差が発生してしまいます。
これを避けるには、
var datetime = DateTime.Now; var plans = context.Plans.Where(w => w.StartAt <= datetime && datetime <= w.EndAt);
とすれば、想定していた動作をしてくれます。
ちなみに、気になったので他にも変換されるものがあるのかなーと調べたら、
いろいろ載せてくれてました。
LINQ にも色々 ~ SQL に変換されるモノと変換されないモノ
ということで、メモ。