日期:2014-05-16 浏览次数:20329 次
1、根据给定的时间段,返回时间段内的月(年/季度)的数组
解析:
这是上周项目中遇到的一个问题,在sql中通过DatePart()函数,加上group by 分组来实现,获取给定时间段内每月(/年、季度)的相关信息,
但是这样有一个问题,如果数据库里边在符合条件的时间段内没有相关信息的话,返回的信息是不完整的,
示例:返回2012年1月1日,到2012年12月31日范围区间的数据,按月分组,正常情况下该出现12个月的信息,但是如果某个月没有信息,则可能
返回的信息少于12条,但是项目要求,应该返回完整的信息,如果没有值的话,默认为0。刚开始的时候毫无头绪,有想过用List来暂时存储信息,
然后最后再做统一处理,但是这样会带来一些不必要的开销。后来想了到这样的方法,主要思想是分段处理,分三段:开始那一年、中间完整的那几年
、最后那一年,这样就把问题给细化,简单了许多。具体请看下面代码
示例:startDate:20060116 ,endDate:20121115,type参数:yy(年),mm(月),qq(季度)
/// <summary>
/// 获取不同日期类型对应的日期数组,yy为年,qq为季度,mm为月
/// </summary>
/// <param name="chart"></param>
/// <returns></returns>
public string[] GetDateCount(string startDate,string endDate,string type)
{
int startYear = Convert.ToInt32(startDate.Substring(0, 4));//开始的那一年
int endYear = Convert.ToInt32(endDate.Substring(0, 4));//结束的那一年
int startMonth, endMonth;//开始/结束的那一月
int yearCount = endYear - startYear + 1;//开始与结束年之差
string[] dates = new string[0];
switch (type)
{
case "yy"://返回的时间粒度为年
dates = new string[yearCount];
for (int i = 0; i < yearCount; i++)
{
dates[i] = startYear.ToString();
startYear++;
}
break;
case "qq"://返回的时间粒度为季度
yearCount = endYear - startYear - 1;//返回完整的年的个数,开始那一年,和结束那一年除外
startMonth = Convert.ToInt32(startTime.Substring(4, 2));//获取开始的那一年的月份
endMonth = Convert.ToInt32(endTime.Substring(4, 2));//获取结束那一年的月份
int qsm, qem, qsml, qeml;
qsm = GetIntQ(startMonth);//调用GetInQuiry函数,获取开始时间为当年的第几季度
qem = GetIntQ(endMonth);//调用GetInQuiry函数,获取结束时间为当年的第几季度
qsml = 4 - qsm;//获取开始那一年有多个季度在统计范围内
qeml = qsm;//获取结束那一年有多少个季度在统计范围内
dates = new string[qsml + yearCount * 4 + qeml];//初始化返回的数组,数组大小即为给定范围内的季度
for (int i = 0; i < qsml; i++)//初始化数组,开始那一年的季度
{
dates[i] = startYear.ToString() + qsm.ToString();
qsm++;
}
for (int y = 1; y <= yearCount; y++)//完整的那几年的季度
{
int j = 1;
int qsi = qsml + (y - 1) * 4;
for (int i = qsi; i < y * 4 + qsml; i++)
{
dates[i] = (startYear + y).ToString() + j.ToString();
j++;
}
}
int qeb = 1;
for (int k = (qsml + yearCount * 4); k < qsml + yearCount * 4 + qeml; k++)//结束那一年的季度
{
dates[k] = endYear.ToString() + qeb.ToString();
qeb++;
}
break;
case "mm":
startMonth = Convert.ToInt32(startTime.Substring(4, 2));
endMonth = Convert.ToInt32(endTime.Substring(4, 2));
int sm = 12 - startMonth + 1;//起始那一年总共的月份
int em = endMonth;//截止那一年总共的月份
yearCount = endYear - startYear - 1;//间隔时间段内完整的年数
dates = new string[sm + yearCount * 12 + em];//总共有多个月要统计
for (int i = 0; i < sm; i++)//起始那一年的月份