반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[Linq] GROUP BY - Week of YEAR (주별 group by) 본문

C#/LINQ

[Linq] GROUP BY - Week of YEAR (주별 group by)

HYOKYE0NG 2021. 12. 1. 09:16
반응형

Blazor에서 수정날짜 데이터를 이용하여 주별로 group by를 수행해야 한다.

또한 현재 날짜를 기준으로 하여 1년 전부터 총 52주의 데이터가 나오도록 lotation을 돌려야 한다.

즉, 1년전의 오늘부터 1주일이 1주차가 되고 최근 1주일이 52주차가 되는 것이다.

 

최종 코드는 다음과 같다.

private List<DateDcn> DcnGroupbyQuery(IEnumerable<W_DCN> dcns)
{
    DateTime startDate = DateTime.Today.AddDays(-365);
    var query = (from dcn in dcns.Where(f => Convert.ToInt32(f.MODIFIED_DATE.ToString("yyyyMMdd")) > Convert.ToInt32(startDate.ToString("yyyyMMdd")))
                 group dcn by ((dcn.MODIFIED_DATE.Date - startDate).Days / 7) into grp
                 select new DateDcn
                 {
                     Week_No = grp.Key.ToString(),
                     Cnt = grp.Count(),
                     Dcn = grp
                 }).ToList();

    return query;
}

이 쿼리에서 주가 되는 컬럼은 MODIFIED_DATA로 수정된 날짜를 담고있는 DateTime 컬럼이다.

startDate에 1년전 오늘의 날짜를 저장했다.

Modified Date가 최근 1년 안의 데이터인지 먼저 체그하고 group by를 진행하였다.

 

Modified Date는 시간까지 모두 저장하고 있기 때문에 .Date를 이용하여 날짜만 가져온 후

Modified Date에서 1년전 오늘의 Date를 뺀 후 일수(Days)를 계산하여 7로 나눈 몫을 week_no(주차)로 계산하여

group by를 수행했다.

 

 

위의 코드는 razor 파일에서 작성한 코드이다.

razor 파일에서는 잘 작동하는데 같은 방식으로 .cs파일인 Service에서 실행하니 다양한 오류가 발생했다.

그래서 Service에서는 조금 다른 방식으로 코드를 작성하였다.

public List<W_DCN> GetDCNList_Dashboard(int week_no, DateTime startdate)
{
    return context.W_DCNS.AsEnumerable()
                         .OrderByDescending(f => f.DCN_NO)
                         .Where(f => f.MODIFIED_DATE.Date > startdate && new TimeSpan(f.MODIFIED_DATE.Date.Ticks - startdate.Ticks).Days / 7 == week_no)
                         .ToList();
}

우선 .cs 파일에서는 DateTime이 부등호로 비교가 되어 굳이 int로 바꾸지 않고도

Modified Date가 startDate보다 이후인지 비교할 수 있었다.

하지만 .cs 파일에서는 Datetime - Datetime이 계산되지 않았다.

따라서 DateTime을 Ticks로 변경하여 계산한 후 TimeSpan으로 변환하여 일수(Days)를 계산했다.

 

 

TimeSpan & Ticks에 대한 개념은 다음을 참고하였다.

 

DateTime.Ticks 속성 (System)

이 인스턴스의 날짜와 시간을 나타내는 틱 수를 가져옵니다.Gets the number of ticks that represent the date and time of this instance.

docs.microsoft.com

반응형

'C# > LINQ' 카테고리의 다른 글

[Linq] GROUP BY - Week of YEAR (주별 group by) 2 - Monday To Sunday  (0) 2021.12.07
[Linq] - Group by + Join (+ Case when~ then)  (0) 2021.11.10
[Linq] - Join  (0) 2021.11.09
[Linq] - Group by  (0) 2021.11.08
Comments