C# c和SQL之间的年度转换

C# c和SQL之间的年度转换,c#,tsql,date,C#,Tsql,Date,因此,我正处于漫长的编程狂潮的尾声,我还有一个逻辑障碍要克服。我的应用程序提供报价请求的KPI。业务负责人要求每周对这些KPI进行细分,我想当这项工作完成后,他们会要求每月进行细分。我在SQL查询中发现了这一点: 从CPKPI中选择qpid,其中DATEPARTww,qpvalidfrom=13 GROUP BY qpid; 这将给我一个QPID列表,用于计算总数,并提供实际的主键用于向下搜索。 我脑子里想不起来的是如何从我的C代码中获得一年中几周的枚举。我查看了GregorianCalanda

因此,我正处于漫长的编程狂潮的尾声,我还有一个逻辑障碍要克服。我的应用程序提供报价请求的KPI。业务负责人要求每周对这些KPI进行细分,我想当这项工作完成后,他们会要求每月进行细分。我在SQL查询中发现了这一点: 从CPKPI中选择qpid,其中DATEPARTww,qpvalidfrom=13 GROUP BY qpid; 这将给我一个QPID列表,用于计算总数,并提供实际的主键用于向下搜索。 我脑子里想不起来的是如何从我的C代码中获得一年中几周的枚举。我查看了GregorianCalandar类,特别是GetWeekOfYear方法,但是我很难找到这些值的枚举


那么我的问题是:给定一个日期范围[比如说2013-01-14到2013-04-10],我如何将一年中的几周作为开始日期和结束日期之间的整数进行枚举?

为了帮助完成此任务和您预期的其他需求,您需要。在数据库中最难做的事情是查询不存在的数据

您可以查询日期表:

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

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

您可以查询日期表:

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

在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中的默认设置相匹配。如果设置不同,则需要指定正确的值。

从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中的默认设置相匹配。如果您的设置不同,则需要指定正确的值。

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

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

同意,但我会做一个表格,把谷物放在一天之内,这样你就可以从一天中得出一周和一个月。谢谢你的回答,我非常感谢日期表格文章的链接。同意,但我会做一个表格,把谷物放在一天之内,这样你就可以从一天中得出一周和一个月。谢谢你的回答,我非常感谢与date table文章的链接。做得好,比我因为缺少睡眠而停留的for循环要好得多int startWeek=GregorianCalandar.GetWeekOfYearstartDate,CalendarWeekRule.FirstFullWeek,DayOfWeek.Monday;int endWeek=GregorianCalandar.GetWeekOfYearstartDate,CalendarWeekRule.FirstFullWeek,DayOfWeek.Monday;forint i=startWeek;我做得很好,比因为缺少睡眠而陷入的for循环要好得多,int startWeek=GregorianCalandar.GetWeekOfYearstartDate,CalendarWeekRule.FirstFullWeek,DayOfWeek.Monday;int endWeek=GregorianCalandar.GetWeekOfYearstartDate,CalendarWeekRule.FirstFullWeek,DayOfWeek.Monday;forint i=startWeek;我