【问题标题】:Entity Framework + Azure, Database in a different time zone than the web app causing problems实体框架 + Azure,数据库与 Web 应用程序位于不同的时区,导致问题
【发布时间】: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


【解决方案1】:

修复非常简单;在将当前时间放入 Linq-to-entities 查询之前将其保存到内存中:

var now = DateTime.Now;
return _dbContext.Events.Where(t => t.DateTime < now)

我的初始查询生成了一个使用GetDate() 代替DateTime.Now 的SQL 查询,它当然评估为数据库上的当前UTC 时间。

由于我的数据完全不知道时区,这可以很好地解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-11-16
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多