C#Linq其中两个日期之间的日期


79

我正在尝试获取linq语句以获取两个日期之间的所有记录,但我不确定要使其正常工作需要进行哪些更改: (a.Start >= startDate && endDate)

var appointmentNoShow =
    from a in appointments
    from p in properties
    from c in clients
    where a.Id == p.OID && (a.Start.Date >= startDate.Date && endDate)

Answers:


146

只需将其更改为

var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID && 
                       (a.Start.Date >= startDate.Date && a.Start.Date <= endDate)

4
@Giorgi,您好:LINQ to Entities不支持指定的类型成员'Date'。
PeaceInMind 2014年

2
@admin,您好,解决方案是不要在表的属性中指定功能Date。例如:db.Invoices.Where(w => w.Date> = Date1.Date && w.Date <= Date2.Date).ToList()。它将起作用;)
JD-DC TECH

@ user1502624在EF主线中不起作用,我已经看到了它的源代码。我已经做了一个可以正常工作的分支。通过将.Date呼叫转换为呼叫来工作EntityFunctions.TruncateDate
阿隆

此查询将忽略在开始日期之前开始并在结束日期之后结束的约会;应该包括多天的约会。如果您需要一个包含此类可能性的查询,请查看此处的“第二个查询” stackoverflow.com/a/7815706/4040647,作者@Enigmativity
Mark Sizer


4
var QueryNew = _context.Appointments.Include(x => x.Employee).Include(x => x.city).Where(x => x.CreatedOn >= FromDate).Where(x => x.CreatedOn <= ToDate).Where(x => x.IsActive == true).ToList();

1

 public List<tbltask> gettaskssdata(int? c, int? userid, string a, string StartDate, string EndDate, int? ProjectID, int? statusid)
        {
            List<tbltask> tbtask = new List<tbltask>();
            DateTime sdate = (StartDate != "") ? Convert.ToDateTime(StartDate).Date : new DateTime();
            DateTime edate = (EndDate != "") ? Convert.ToDateTime(EndDate).Date : new DateTime();
            tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).
                Where(x => x.tblproject.company_id == c
                    && (ProjectID == 0 || ProjectID == x.tblproject.ProjectId)
                    && (statusid == 0 || statusid == x.tblstatu.StatusId)
                    && (a == "" || (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)))
                    && ((StartDate == "" && EndDate == "") || ((x.StartDate >= sdate && x.EndDate <= edate)))).ToList();



            return tbtask;


        }

这是我对基于searchdata和开始日期至结束日期的搜索记录的查询


1

如果有人想知道如何处理2个清单以及两个日期之间

var newList = firstList.Where(s => secondList.Any(secL => s.Start > secL.RangeFrom && s.End < secL.RangeTo))

1

如果您具有日期间隔过滤条件,则需要选择部分属于此过滤范围的所有记录。假设:记录具有ValidFrom和ValidTo属性。

DateTime intervalDateFrom = new DateTime(1990, 01, 01);
DateTime intervalDateTo = new DateTime(2000, 01, 01);

var itemsFiltered = allItems.Where(x=> 
    (x.ValidFrom >= intervalDateFrom && x.ValidFrom <= intervalDateTo) ||
    (x.ValidTo >= intervalDateFrom && x.ValidTo <= intervalDateTo) ||
    (intervalDateFrom >= x.ValidFrom && intervalDateFrom <= x.ValidTo) ||
    (intervalDateTo >= x.ValidFrom && intervalDateTo <= x.ValidTo)
);

0

因此,由于答案不起作用,您正在向下滚动:

这就像魔术一样工作(但他们说大数据存在效率问题,而且您并不像我一样在乎)

1-在我的情况下,数据库中的数据类型为“ datetime”和“ nullable”。

DB中的示例数据格式如下:

2018-11-06 15:33:43.640

在C#中,当转换为字符串时,它类似于:

2019-01-03 4:45:16 PM

因此,格式为:

yyyy/MM/dd hh:mm:ss tt

2-因此,您需要首先以适当的格式准备datetime变量:

例子1

yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")

示例2-最近30天的日期时间范围

    DateTime dateStart = DateTime.Now.AddDays(-30);
    DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);

3-最后,您迷失了寻找时间的linq查询(需要EF 6)

using System.Data.Entity;

_dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();

同时考虑时间比较:

(DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) >= dateStart && DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) <= dateEnd)

请注意在其他stackoverflow问题和答案中提到的以下方法将无法正常工作:

....
&&
(
    s.Created_at.Value.Day >= dateStart.Day && s.Created_at.Value.Day <= dateEnd.Day &&
    s.Created_at.Value.Month >= dateStart.Month && s.Created_at.Value.Month <= dateEnd.Month &&
    s.Created_at.Value.Year >= dateStart.Year && s.Created_at.Value.Year <= dateEnd.Year
)).count();

例如,如果开始日期在本月,而结束日期在下个月,则查询将返回false并且没有结果,例如:

DatabaseCreatedAtItemThatWeWant = 2018/12/05

startDate = 2018/12/01

截止日期= 2019/01/04

该查询将始终搜索01到04之间的天,而不考虑“月”,因此“ s.Created_at.Value.Day <= dateEnd.Day”将失败

并且如果您有非常大的数据,则可以执行本机SQL查询而不是linq

...
    ... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
    ....

谢谢


在日期范围内仍无法获取正确的项目。
亚当·里

0

我在使它工作时遇到问题。

我在数据库行中有两个日期,我需要将它们添加到昨天,今天和明天的列表中。

这是我的解决方案:

        var yesterday = DateTime.Today.AddDays(-1);
        var today = DateTime.Today;
        var tomorrow = DateTime.Today.AddDays(1);            
        var vm = new Model()
        {
            Yesterday = _context.Table.Where(x => x.From <= yesterday && x.To >= yesterday).ToList(),
            Today = _context.Table.Where(x => x.From <= today & x.To >= today).ToList(),
            Tomorrow = _context.Table.Where(x => x.From <= tomorrow & x.To >= tomorrow).ToList()
        };
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.