C # Linq Where Date Between 2 Dates


81

두 날짜 사이의 모든 레코드를 가져 오기 위해 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)

답변:


148

그냥 변경하십시오

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 : 지정된 형식 멤버 'Date'는 LINQ to Entities에서 지원되지 않습니다.
PeaceInMind

2
안녕하세요 @admin에 대한 해결책은 테이블 속성에서 Date 함수를 지정하지 않는 것입니다. 예 : db.Invoices.Where (w => w.Date> = Date1.Date && w.Date <= Date2.Date) .ToList (). 그것은 작동합니다)
JD - DC TECH

@ user1502624 그것은 EF 메인 라인에서 작동하지 않으며 그에 대한 소스 코드를 보았습니다. 작동하는 지점을 만들었습니다. .Date통화를 통화로 변환하여 작동합니다 EntityFunctions.TruncateDate.
Aron

이 쿼리는 시작 날짜 이전에 시작되고 종료 날짜 이후에 끝나는 약속을 생략합니다. 포함되어야하는 수 일간의 약속. 이러한 가능성을 포함하는 쿼리가 필요한 경우 여기에서 "두 번째 쿼리"를 살펴보십시오. stackoverflow.com/a/7815706/4040647 by @Enigmativity
Mark Sizer

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

6
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;


        }

이 검색 데이터를 기반으로 시작 날짜와 종료 날짜 사이에 검색 레코드에 대한 내 쿼리


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

EndDate = 2019/01/04

쿼리는 항상 "월"을 고려하지 않고 01과 04 사이의 일을 검색하므로 "s.Created_at.Value.Day <= dateEnd.Day"는 실패합니다.

그리고 정말로 큰 데이터가있는 경우 linq가 아닌 Native SQL Query를 실행합니다.

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

감사


여전히 날짜 범위에서 올바른 항목을 가져 오지 못합니다.
Adam Ri

0

이 작업을 수행하는 데 문제가 있습니다.

DB 줄에 두 개의 날짜가 있고 어제, 오늘, 내일 목록에 추가해야합니다.

이것은 내 해결책입니다.

        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()
        };
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.