EF Core,按 UTC 日期的月份和年份分组

2023-12-09

我将所有日期存储为 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,我在 1/09/2020 00:30 AM 创建了一张票证,但由于它存储为 UTC(我是 +2),因此它将存储为 2020-08-31 22:25。现在,如果我按月分组,我会将此实体分组在错误的月份。有没有什么简单的方法可以不依赖内存来做到这一点?


有几种方法可以引入映射到 sql 函数或原始 sql 片段的 c# 函数。

对于直接映射到同名sql函数的函数,只需要定义方法即可;

public static ReturnType CustomMethod(ArgType arg) => throw new NotImplementedException();

protected override void OnModelCreating(ModelBuilder builder){
    builder.HasDbFunction(typeof(Context).GetMethod(nameof(CustomMethod)));
}

或者使用[DbFunction]该方法的属性。

为了生成像“@date AT TIME ZONE @name”这样的sql片段,你不能只使用一个实例SqlFunctionExpression,还有一些工作要做。

public static DateTimeOffset ToTimeZone(this DateTimeOffset value, string name) => throw new NotImplementedException();

public class SqlFragmentListExpression : SqlExpression
{
    public SqlFragmentListExpression(Type type, RelationalTypeMapping typeMapping, params SqlExpression[] fragments) : base(type, typeMapping)
    {
        Fragments = fragments;
    }

    public SqlExpression[] Fragments { get; }

    public override void Print(ExpressionPrinter expressionPrinter)
    {
        foreach (var f in Fragments)
            f.Print(expressionPrinter);
    }

    protected override Expression VisitChildren(ExpressionVisitor visitor)
    {
        var frags = new SqlExpression[Fragments.Length];
        var changed = false;
        for(var i = 0; i < Fragments.Length; i++)
        {
            frags[i] = (SqlExpression)visitor.Visit(Fragments[i]);
            changed |= frags[i] != Fragments[i];
        }
        return changed ? new SqlFragmentListExpression(Type, TypeMapping, frags) : this;
    }
}

// OnModelCreating
builder                
    .HasDbFunction(typeof(Extensions).GetMethod(nameof(Extensions.ToTimeZone)))
    .HasTranslation(args => {
        var dto = args.ElementAt(0);
        return new SqlFragmentListExpression(dto.Type, dto.TypeMapping,
            dto,
            new SqlFragmentExpression(" AT TIME ZONE "),
            args.ElementAt(1));
    });

然后您可以在查询中使用该方法,例如;

_dbContext.Tickets
    .Where(x => x.Date >= from && x.Date <= to)
    .Select(x => new {
        Date = x.Date.ToTimeZone("Central European Standard Time")
    })
    .GroupBy(x => new {
        Year = x.Date.Year,
        Month = x.Date.Month
    },
    (x, e) => new {
        x.Year,
        x.Month,
        Count = e.Count()
    })

应该将其翻译成sql;

SELECT DATEPART(year, [t].[Date] AT TIME ZONE N'Central European Standard Time') AS [Year],
    DATEPART(month, [t].[Date] AT TIME ZONE N'Central European Standard Time') AS [Month], 
    COUNT(*) AS [Count]
FROM [Tickets] AS [t]
GROUP BY DATEPART(year, [t].[Date] AT TIME ZONE N'Central European Standard Time'),
    DATEPART(month, [t].[Date] AT TIME ZONE N'Central European Standard Time')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF Core,按 UTC 日期的月份和年份分组 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 创建参考 y 值的垂直堆叠条形图(岩性/地层柱)

    我想制作一个堆积条形图 其中 y axis md litho x axis litho 数据 我已经尝试使用我修改过的代码来实现它另一个问题在堆栈溢出上 path pd ExcelFile F Backup JN Litologi lito
  • 在 Javascript 中覆盖 undefined 和 IIFE

    我一直在阅读 你不懂Js 系列 并发现了这一点 此模式的另一个应用解决了默认值的 次要利基 问题undefined标识符的值可能会被错误地覆盖 从而导致意外结果 通过命名参数undefined 但不为该参数传递任何值 我们可以保证undef
  • 单击“管理解决方案的 nuget 包”Visual Studio 2015 时 Nuget 包管理器崩溃

    因此 当单击 管理解决方案的 nuget 包 按钮时 我的 Visual Studio 崩溃了 如果我选择调试我会收到此消息 PresentationFramework dll 中发生 System Windows Markup XamlP
  • 之间的区别

    当我使用malloc在 C 程序中 我收到警告 warning incompatible implicit declaration of built in function malloc enabled by default 然后我可以包括
  • 用于提取特定 XML 标记值的批处理文件

    我需要一个批处理文件来检索Data仅标记值 不带标记名称 并将其写入 txt 文件 该文件可能具有比列出的更多的 XML 标签 所以输出应该是 资本收益是美国收入差距的关键因素 而胜利者背后的力量是我们经济体系的全部准则 如果您想平衡在美国
  • 使用 EL 和 JSTL 访问枚举值

    我有一个名为 Status 的枚举 定义如下 public enum Status VALID valid OLD old private final String val Status String val this val val pu
  • Spring - 如何对单个资源应用投影?

    我正在尝试对名为的实体类应用投影Institute 我定义了以下投影类 Projection name instituteProjection types Institute class public interface Institute
  • 使用 I-Beacon 的室内导航 - 准确性正在迅速变化

    我正在使用 I Beacon 做一个室内导航应用程序 为此 我使用信标给出的精度 但情况正在迅速改变 由于该值正在变化 因此即使当我处于静态时 必须计算的用户位置的 X 和 Y 坐标也会变化 因此 请帮助我在我不移动时使精度保持不变 提前致
  • 在 Java 中如何在修改对象时迭代该对象? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 高效相当于在迭代集合时进行删除 在java中迭代集合时从集合中删除项目 我正在尝试循环HashMap Map
  • 运行时 GPU 执行还是 CPU 执行?

    我觉得必须有一种方法来编写代码 使其可以在 CPU 或 GPU 中运行 也就是说 我想编写一些具有 例如 CPU FFT 实现的东西 如果没有 GPU 该实现可以执行 但当 GPU 存在时默认为 GPU FFT 我无法提出正确的问题来让互联
  • 我的 JavaScript 代码只打印一行。我需要它打印 10 行,每行 20 个字符。

    这是一个抛硬币随机发生器 我需要打印 10 行 20 列 这就是我被困住的地方 每次我单击按钮时 我的代码似乎都会正确随机化 它显示 20 列 但我似乎无法让它打印第二行 这可能是一些简单的事情 我只是没有抓住 任何事情都会受到赞赏 Jav
  • 确定 viewWillAppear 是来自打开应用程序,还是取消选择模式

    我目前正在初始屏幕上加载应用程序加载数据 在我看来这会发生 我还有一个在此屏幕上弹出的模式 关闭时执行与 viewWillAppear 中加载数据相同的逻辑 如何仅在应用程序打开时加载数据 而不是在模式关闭时加载数据 UIViewContr
  • std::vector 中的数据存储是连续的吗? [复制]

    这个问题在这里已经有答案了 我有一个字符向量 我想将其内容作为 char 传递给另一个函数 void foo boost shared ptr
  • 难以理解/可视化 SICP 流汉明数程序

    我基本上陷入了 SICP 练习 3 56 的困境 问题是这样的 练习3 56 R Hamming 首先提出的一个著名问题是 按升序且不重复地枚举除 2 3 或 5 之外没有质因数的所有正整数 一种明显的方法是简单地测试每个整数反过来看看它是
  • 制作一个循环来形成一个列表?

    def make services routes data routes curr route x split routes routes data service data1 x 1 106 106 1 1 43009 106 2 51
  • C# 将列表与自定义对象进行比较但忽略顺序

    我正在尝试比较两个包含自定义对象的列表 包装在一个对象中 我不关心顺序 但如果列表 1 包含 1 2 3 4 那么列表 2 必须and only包含这些元素 例如 4 2 3 1 基于比较两个 List 对象是否相等 忽略顺序ignorin
  • 如何在 PHP 中实时实现 For 循环

    我想制作一个实时给出结果的脚本 在我的脚本中它有 3 个步骤 第一步是从网页中获取所有链接 我使用 pregmatch all 函数 因为我需要的所有链接都以相同的域开始http example com docs 并从中抓取http tes
  • Windows 中的 64 位和 32 位注册表问题(C# 编程)

    我正在尝试将数据从 Windows 注册表获取到我的软件 但有一件事我遇到了麻烦 如果我的软件在 64 位系统上运行 则注册表路径将为 HKEY LOCAL MACHINE SOFTWARE Wow6432Node AVAST Softwa
  • 将 BigQuery 脚本的结果返回到 Python 客户端

    截至 2019 年秋季 BigQuery 支持脚本编写 这太棒了 我不明白的是BigQuery 的 Python 客户端尚有能力利用这一新功能 例如 运行以下 Python 代码 client bigquery Client QUERY B
  • EF Core,按 UTC 日期的月份和年份分组

    我将所有日期存储为 UTC 并且我需要按月份和年份对实体进行分组 所以我正在这样做 dbContext Tickets Where x gt x Date gt from x Date lt to GroupBy x gt new Year