0

所以我已经结束了漫长的编程狂潮,我还有一个逻辑障碍需要克服。我的应用程序为报价请求提供 KPI。业务负责人要求按周对这些 KPI 进行细分,我想当这完成时,请求将按月细分。我在我的 SQL 查询中发现了这一点:
SELECT qpid FROM cpkpis WHERE DATEPART(ww, qpvalidfrom)=13 GROUP BY qpid;
这将为我提供一个 qpid 列表以计算总数并提供实际的主键以进行深入研究。
我无法理解的是如何从我的C#代码中获取一年中的几周的枚举。我已经看过了GregorianCalandar Class,特别是,GetWeekOfYear Method但我在列举这些值时遇到了麻烦。

那么我的问题是:给定一个日期范围[让我们说]我将如何枚举开始日期和结束日期之间2013-01-14的一年中的几周?2013-04-10ints

4

3 回答 3

3

为了帮助完成这项任务和您预期的其他要求,您需要一个日期表。恕我直言,在数据库中最难做的事情是查询不存在的数据。

可以查询日期表:

Select Distinct DatePart(ww, dateField) as WeekNo
from DateTable
where dateField between '2013-01-14' and '2013-04-10';
于 2013-04-11T17:32:11.870 回答
0

在 T-SQL 中,你可以使用类似的东西:

DECLARE @StartDate DATE = '2013-01-14';
DECLARE @EndDate DATE = '2013-04-10';

WITH weekcte AS
     (SELECT DATEADD(dd, -1, DATEADD(wk, DATEDIFF(wk, 0, @StartDate), 0)) AS DateValue
       UNION ALL     
      SELECT DATEADD(wk, 1, DateValue)
        FROM weekcte
       WHERE DATEADD(wk, 1, DateValue) <= @EndDate )
SELECT DATEPART(ww, w.DateValue) AS 'Week No'
  FROM weekcte AS w;
于 2013-04-11T18:51:52.743 回答
0

在 C# 中,迭代器可能是最简单的选项:

public static IEnumerable<int> WeekNumbersBetween(
   DateTime startDate, 
   DateTime endDate, 
   Calendar calendar = null,
   CalendarWeekRule weekRule = CalendarWeekRule.FirstDay,
   DayOfWeek firstDayOfWeek = DayOfWeek.Sunday)
{
   if (calendar == null)
   {
      calendar = new GregorianCalendar();
   }

   DateTime week = startDate;
   while (week <= endDate)
   {
      yield return calendar.GetWeekOfYear(week, weekRule, firstDayOfWeek);
      week = week.AddDays(7);
   }
}

weekRule和参数的默认值firstDayOfWeek应与 SQL 中的默认设置相匹配。如果您的设置不同,则需要指定正确的值。

于 2013-04-11T17:44:20.837 回答