EF日期格式筛选_EF常用日期筛选逻辑整理

一、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<student> 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], xxxxxxxx
FROM [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

更多参考:

sqlserver计算时间差DATEDIFF 函数

EF日期筛选异常:SqlServer.DATEDIFF”函数的 DATEPART 参数必须是文字字符串。

http://blog.163.com/m13864039250_1/blog/static/21386524820141184595445/

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值