【发布时间】:2016-04-13 22:07:51
【问题描述】:
我正在 Azure 应用服务上运行 MVC Core Web 应用,并为数据库提供一个 Azure SQL Server 实例。
我通过 Azure Portal 将 App Service 的时区更改为 CEST,目前为 GMT+2。
数据库在北欧的 Azure 中,我不知道数据库上的时区是什么,但很可能是 GMT 或英国夏令时。
我的日期存储为简单的 datetime2 值,这意味着它们没有 TimeZone 信息。这意味着每当我在数据库中(而不是内存中)进行比较日期的查询时,查询都会返回不正确的结果。
我正在使用 Entity Framework Core (7) 从数据库中查询。
应该返回过去事件但不包括过去两个小时的事件的查询示例:
private IOrderedQueryable<Event> GetPastEvents()
{
var result = _dbContext.Events
.Where(t => t.DateTime < DateTime.Now)
.OrderByDescending(e => e.DateTime);
return result;
}
究竟是什么原因造成的? 处理这个问题的最佳方法是什么?
【问题讨论】:
-
没有应用程序代码和 SQL 查询就无法提供帮助。是什么导致了问题?为什么数据库的 时间 对存储的值很重要?您是否在应用程序 和 数据库中混合了本地时间和 UTC 时间?当然,真正的解决方法是在数据库和应用程序中使用 DateTimeOffset。或存储仅 UTC 时间并在SQL 中调用UTC 函数。而不是
GETDATE()使用GETUTCDATE() -
这与 Unicode 与 ANSI 问题没有什么不同。真正的解决方案是使用 Unicode。错误的解决方法是修复代码页,知道这将在某个点或另一个点中断。
-
感谢您的回复,我已经编辑了这个问题,希望更清楚。我的猜测是我混合了 UTC 时间和当地时间,是的,但我很清楚具体如何。我最初的想法是快速解决方法是更改数据库的时区。那可能吗?理想情况下,我会存储和使用 UTC 时间,但这意味着我必须更改我的数据模型、编码和转换数据,因此最好使用更简单的解决方法。
-
我认为没有快速解决办法。将所有日期以 UTC 时间存储在数据库中,并且在您需要向用户显示本地时间时,在此处进行转换,然后在保存时转换回 UTC。
-
@fiskeboss 不是 database 导致了问题。这是保存数据时引起的。那里存储的日期是什么? UTC 或一些本地偏移量?谁保存了它们,那台机器在保存数据时的偏移量是多少?
标签: c# sql-server entity-framework datetime azure