EF Core SQL Server使用GETDATE()替代C# DateTime.Now

8

我注意到,如果我的 C# 查询包含

(e => e.MyDateTimeData == DateTime.Now)

生成的 SQL 使用

WHERE [e].[MyDateTimeData] = GETDATE()

如果EF客户端时区与SQL Server主机SQL Server进程用户时区不同,那么这将不好。

即使客户端进程和SQL Server进程在同一台主机上运行,时区也可能不同。

我是否遗漏了什么,或者这是一个真正的问题?


1
GETDATE() 的值是从运行 SQL Server 实例的计算机操作系统中派生的(而不是客户端计算机设置)。 - Vitaly Borisov
你应该决定使用哪个日期。是数据库的GETDATE,还是应用程序或客户端?不要混合使用。我使用应用程序日期,并将对象中的日期存储到数据库中。我的数据库对日期不做任何处理。 - daremachine
不要使用 DateTime,而是使用 DateTimeOffset - Erik Philips
@ErikPhilips,你尝试使用DateTimeOffset.Now解决同样的问题了吗?我打赌问题是一样的,我的意思是:我指示代码使用客户端的时钟,但它使用的是服务器的时钟。这不是时区问题,而是关于忠实度和一致性的问题。请参见@David Browne的答案,他和我应该做完全相同的事情。除了以上所有内容之外,建议使用DateTimeOffset,但这与问题无关。 - g.pickardou
我的评论与.Now无关。我的评论不是关于主题的,也不需要评论与主题相关。 - Erik Philips
显示剩余2条评论
1个回答

3

如果您想使用客户端时间,则将其作为参数传递,如下所示:

var dt = DateTime.Now;
. . .
var q = db.SomeTable.Where(e => e.MyDateTimeData == dt)

你的代码和我的代码的结果不应该有差异,但是仍然存在差异。所以如果我理解正确的话,这是一个问题。 - g.pickardou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接