なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

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

これを避けるには、

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

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

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

LINQ にも色々 ~ SQL に変換されるモノと変換されないモノ

ということで、メモ。