所以我在漫长的编程狂欢结束时,我还有一个逻辑障碍可以克服。我的应用程序提供了报价请求的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-10
]我如何在开始日期之间查看一年中的周数ints
和结束日期?
答案 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);
}
}
weekRule
和firstDayOfWeek
参数的默认值应与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;