読者です 読者をやめる 読者になる 読者になる

みかづきメモ

学習したことのメモとか、日記とか、備忘録。

LINQ to Entities での DateTime.Now

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 で処理されるのに、SQLiteSTRFTIMEUTC なので時差が発生してしまいます。

これを避けるには、

var datetime = DateTime.Now;
var plans = context.Plans.Where(w => w.StartAt <= datetime && datetime <= w.EndAt);

とすれば、想定していた動作をしてくれます。

ちなみに、気になったので他にも変換されるものがあるのかなーと調べたら、
いろいろ載せてくれてました。

codezine.jp

ということで、メモ。