【发布时间】:2020-09-21 13:04:20
【问题描述】:
我将所有日期存储为 UTC,我需要按月和年对实体进行分组,所以我正在这样做:
_dbContext.Tickets.Where(x => x.Date >= from && x.Date <= to).GroupBy(x=> new {
Year = x.Date.Year,
Month = x.Date.Month
}).Select(x=> new {x.Key, Count = x.Count()})
由于日期是 UTC,我在 2020 年 1 月 9 日上午 00:30 创建了一张票,但由于它存储为 UTC(我是 +2),它将被存储为 2020-08-31 22: 25.现在,如果我按月分组,我将把这个实体分组在错误的月份。有没有什么简单的方法可以不在内存上做到这一点?
【问题讨论】:
-
先判断哪里出了问题。您想按 UTC 还是本地时间分组?您可以使用:x.Date.ToLocalTime >= from && x.Date.ToLocalTime
-
@jdweng 我认为
ToLocalTime不会是 Linq to Entities 的 regonized。 -
过滤器可以忽略,但由于从 e 到都是 UTC,与 db 中的日期相同,过滤器很好,它不需要 .ToLocalTime()。如果我可以在“Month = x.Date.ToLocalTime().Month”之类的分组部分中设置 ToLocalTime,那会很好,但我不能,因为它将在本地进行评估。@jdwengspan>
-
Sql 服务器?所以要生成sql
date AT TIME ZONE @name?可能有一种方法可以定义自定义数据库函数.... -
或者定义
[DbFunction] public static DateTimeOffset SWITCHOFFSET (DateTimeOffset value, string timezone)? (docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0/…, docs.microsoft.com/en-us/sql/t-sql/functions/…)
标签: c# asp.net-core entity-framework-core