博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF日期格式筛选_EF常用日期筛选逻辑整理
阅读量:4288 次
发布时间:2019-05-27

本文共 3276 字,大约阅读时间需要 10 分钟。

一、EF日期格式筛选,获取本年,本月,本日等

1.直接使用DateTime的部分值相等

//获取上一个月            DateTime date = DateTime.Now.AddMonths(-1);            int count = _context.students.Where(q =>             q.sbirthday.Value.Year == date.Year            &&q.sbirthday.Value.Month== date.Month            ).Count();

2.使用时间短筛选

//获取上2个月到今天DateTime start = DateTime.Now.AddMonths(-2);DateTime end = DateTime.Now;List
list = _context.students.Where(q => q.sbirthday >= start && q.sbirthday < end) .ToList();Console.WriteLine(list.Count);

 

二、EF日期格式筛选,方式2 ,使用SqlFunctions

在EF中日期筛选需要使用SqlFunctions,特别需要注意一下命名空间

namespace System.Data.Entity.SqlServer{    //    // 摘要:    //     包含在 Linq to Entities 中公开 SqlServer 方法的函数存根。    public static class SqlFunctions

时间差计算函数,对应SqlServer数据库的DATEDIFF函数

//        // 摘要:        //     返回所指定开始日期和结束日期之间的指定日期部分边界的计数。        //        // 参数:        //   datePartArg:        //     要计算时间间隔差值的日期部分。        //        //   startDate:        //     第一个日期。        //        //   endDate:        //     第二个日期。        //        // 返回结果:        //     两个日期之间的时间间隔数。        [DbFunction("SqlServer", "DATEDIFF")]        [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "startDate")]        [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "endDate")]        [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "datePartArg")]        public static int? DateDiff(string datePartArg, DateTime? startDate, DateTime? endDate);

关于DATEDIFF函数,计算差值为指定类型的总差值:

select DATEDIFF(day,'2016-1-1','2017-1-1');	select DATEDIFF(month,'2016-1-1','2017-1-1');        select DATEDIFF(year,'2016-1-1','2017-1-1');

注:对应需要判断大于多少天或月的处理逻辑需要使用表达式>数字,例如:大于3天的记录 DATEDIFF(Day,'xx','xx')>3
判断少于多少天需要表达式<=数字

 

使用实例:

DateTime date = DateTime.Now.AddMonths(-1);//本年int count1 = _member.DbSet.Where(q => SqlFunctions.DateDiff("year", q.ActiveTime, date) == 0).Count();//本月int count2 = _member.DbSet.Where(q => SqlFunctions.DateDiff("month", q.ActiveTime, date) == 0).Count();//本天int count3 = _member.DbSet.Where(q => SqlFunctions.DateDiff("day", q.ActiveTime, date) == 0).Count();

自动生成的Sql代码:

exec sp_executesql N'SELECT [Extent1].[ActiveAmount] AS [ActiveAmount]FROM [dbo].[Member_Info] AS [Extent1]WHERE ([Extent1].[IsActive] = 1) AND (0 = (DATEDIFF(day, [Extent1].[ActiveTime], @p__linq__0)))',N'@p__linq__0 datetime2(7)',@p__linq__0='2017-01-02 00:00:00'

 

三、筛选指定月日时间段之间的数据,不关心哪一年

原理使用 Sql中 的  DayOfYear ,当前时间的本年中第几天,在开始时间结束时间的本年中第几天来判断。

一下是EF Core中的代码示例:

if (payStart != null)                query = query.Where(q => q.FeeTime.DayOfYear >= payStart.Value.DayOfYear);            if (payEnd != null)                query = query.Where(q => q.FeeTime.DayOfYear < payEnd.Value.DayOfYear);

执行Sql 时生成的代码:

exec sp_executesql N'SELECT [q].[ID], [q].[CompanyID], [q].[CompanyName], xxxxxxxxFROM [ProjectInfo] AS [q]WHERE (DATEPART(dayofyear, [q].[FeeTime]) >= @__payStart_Value_DayOfYear_0) AND (DATEPART(dayofyear, [q].[FeeTime]) < @__payEnd_Value_DayOfYear_1)ORDER BY [q].[CreateTime] DESC, [q].[State]OFFSET @__p_2 ROWS FETCH NEXT @__p_3 ROWS ONLY',N'@__payStart_Value_DayOfYear_0 int,@__payEnd_Value_DayOfYear_1 int,@__p_2 int,@__p_3 int',@__payStart_Value_DayOfYear_0=206,@__payEnd_Value_DayOfYear_1=231,@__p_2=0,@__p_3=10

 

 

 

 

更多参考:

你可能感兴趣的文章
运动减肥篇
查看>>
一生的资本
查看>>
高效能人事七习惯
查看>>
依靠自我
查看>>
java实现多个文件打包tar gz
查看>>
java实现多文件打包成zip
查看>>
没啥聊的,说说自己的北漂简史吧
查看>>
谷歌Google SDK 对比 华为 HMS sdk,列表
查看>>
Android 11 新特性和API兼容
查看>>
android UI-Layout界面布局
查看>>
Spinner 和 ArrayAdapter 的用法
查看>>
startActivity(),startActivityForResult(),
查看>>
Back键
查看>>
程序的暂停sleep(),wait()
查看>>
Java,android涉及的所有数据类型
查看>>
android View控件布局
查看>>
android PowerManager电源管理
查看>>
android 系统广播
查看>>
android 广播的使用与开发
查看>>
web客户端的存储
查看>>