c#和SQL之间的一年中的翻译

时间:2013-04-11 17:12:22

标签: c# tsql date

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

我的问题是这样的:给定一个日期范围[让我们说2013-01-142013-04-10]我如何在开始日期之间查看一年中的周数ints和结束日期?

3 个答案:

答案 0 :(得分:3)

为了帮助完成此任务以及您预期的其他要求,您需要date table。恕我直言,在数据库中最难做的事情是查询不存在的数据。

您可以查询日期表:

Select Distinct DatePart(ww, dateField) as WeekNo
from DateTable
where dateField between '2013-01-14' and '2013-04-10';

答案 1 :(得分: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);
   }
}

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

答案 2 :(得分: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;