所以基本上我在做什么是首先选择全年的SUM UPLACENO
并显示它。
然后我选择整年,但逐季(4x3个月),当我总结时,它给了我不同的结果。我不知道为什么,我认为可能是因为日期跨度但我认为没关系。所以,如果你需要更多的东西,请告诉我,但这是完成所有工作的代码。
这是我的第一个功能:
using (FbCommand cmd = new FbCommand("SELECT SUM(UPLACENO) FROM DOKUMENT WHERE (VRDOK = 15) AND (MAGACINID = @MagacinID) AND (DATUM BETWEEN @PocetakMeseca AND @KrajMeseca) OR (VRDOK = 13) AND (MAGACINID = @MagacinID) AND (DATUM BETWEEN @PocetakMeseca AND @KrajMeseca)", con))
{
decimal[] mesecneVrednosti = new decimal[magacini.Length];
FbDataReader dr;
cmd.Parameters.Add("@MagacinID", FbDbType.Integer);
cmd.Parameters.Add("@PocetakMeseca", FbDbType.Date);
cmd.Parameters.Add("@KrajMeseca", FbDbType.Date);
DateTime pocetakMeseca = new DateTime(trenutnaBaza, 1, 1, 0, 0, 0);
DateTime krajMeseca = new DateTime(trenutnaBaza, 1, 31, 23, 59, 59);
DateTime krajGodine = new DateTime(trenutnaBaza, 12, 31, 23, 59, 59);
int i = 0;
while (krajMeseca < krajGodine)
{
cmd.Parameters["@MagacinID"].Value = magacin;
cmd.Parameters["@PocetakMeseca"].Value = pocetakMeseca;
cmd.Parameters["@KrajMeseca"].Value = krajMeseca;
dr = cmd.ExecuteReader();
while (dr.Read())
{
if (!(dr[0] is DBNull))
{
mesecneVrednosti[i] = Convert.ToDecimal(dr[0]);
}
else
{
mesecneVrednosti[i] = 0;
}
}
dr.Close();
pocetakMeseca = pocetakMeseca.AddMonths(1);
krajMeseca = krajMeseca.AddMonths(1);
i++;
}
currentChart.Titles.Add("Magacini");
for (int y = 0; y < meseci.Length; y++)
{
Series series = currentChart.Series.Add(Convert.ToString(meseci[y]));
series.Points.Add(Convert.ToDouble(mesecneVrednosti[y]));
currentChart.Series[y]["PointWidth"] = "1.8";
}
}
这是第二个:
using (FbCommand cmd = new FbCommand("SELECT SUM(UPLACENO) FROM DOKUMENT WHERE (VRDOK = 15) AND (MAGACINID = @MagacinID) AND (DATUM BETWEEN @PocetakKvartala AND @KrajKvartala) OR (VRDOK = 13) AND (MAGACINID = @MagacinID) AND (DATUM BETWEEN @PocetakKvartala AND @KrajKvartala)", con))
{
decimal v_prviKvartal = 0;
decimal v_drugiKvartal = 0;
decimal v_treciKvartal = 0;
decimal v_cetvrtiKvartal = 0;
FbDataReader dr;
cmd.Parameters.Add("@MagacinID", FbDbType.Integer);
cmd.Parameters.Add("@PocetakKvartala", FbDbType.Date);
cmd.Parameters.Add("@KrajKvartala", FbDbType.Date);
DateTime pocetakKvartala = new DateTime(trenutnaBaza, 1, 1, 0, 0, 0);
DateTime krajKvartala = new DateTime(trenutnaBaza, 3, 31, 23, 59, 59);
DateTime krajGodine = new DateTime(trenutnaBaza, 12, 31, 23, 59, 59);
int kvartal = 1;
while (krajKvartala < krajGodine)
{
cmd.Parameters["@MagacinID"].Value = magacin;
cmd.Parameters["@PocetakKvartala"].Value = pocetakKvartala;
cmd.Parameters["@KrajKvartala"].Value = krajKvartala;
dr = cmd.ExecuteReader();
while (dr.Read())
{
if (!(dr[0] is DBNull))
{
switch(kvartal)
{
case 1:
v_prviKvartal = Convert.ToDecimal(dr[0]);
break;
case 2:
v_drugiKvartal = Convert.ToDecimal(dr[0]);
break;
case 3:
v_treciKvartal = Convert.ToDecimal(dr[0]);
break;
case 4:
v_cetvrtiKvartal = Convert.ToDecimal(dr[0]);
break;
}
}
else
{
prviKvartal.Text = "0";
}
}
dr.Close();
pocetakKvartala = pocetakKvartala.AddMonths(3);
krajKvartala = krajKvartala.AddMonths(3);
kvartal++;
}
decimal ukupno = v_prviKvartal + v_drugiKvartal + v_treciKvartal + v_cetvrtiKvartal;
prviKvartal.Text = String.Format("{0:n}", v_prviKvartal) + " - " + String.Format("{0:n}%", (v_prviKvartal / ukupno) * 100);
drugiKvartal.Text = String.Format("{0:n}", v_drugiKvartal) + " - " + String.Format("{0:n}%", (v_drugiKvartal / ukupno) * 100);
treciKvartal.Text = String.Format("{0:n}", v_treciKvartal) + " - " + String.Format("{0:n}%", (v_treciKvartal / ukupno) * 100);
cetvrtiKvartal.Text = String.Format("{0:n}", v_cetvrtiKvartal) + " - " + String.Format("{0:n}%", (v_cetvrtiKvartal / ukupno) * 100);
}
答案 0 :(得分:1)
您只能使用AddMonths(1)
来结束月末。它将一直有效,直到二月(给你28.02
或29.02
),但之后你将获得 March 的第28位(或第29位),所以上。因此,在第一种情况下,您计算的不是整个月,而在季度情况下,您不小心不会在几天内计算。
您可以使用此处的解决方案:[How do I get the last day of a month?]以查找请求参数
答案 1 :(得分:0)
解决!!!
问题是DateTime.AddMonth
将+1
添加到月份,所以当2月到来(28天)并且它增加了一个月,但现在仍然是第28天但现在是3月。
krajMeseca = new DateTime(trenutnaBaza, krajMeseca.Month + 1, DateTime.DaysInMonth(trenutnaBaza, krajMeseca.Month + 1), 23, 59, 59);