两个相同的命令/函数,具有时间跨度(仍然是全年)但不同的结果SQL

时间:2017-01-17 15:58:21

标签: c# sql

所以基本上我在做什么是首先选择全年的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);
                }

2 个答案:

答案 0 :(得分:1)

您只能使用AddMonths(1)来结束月末。它将一直有效,直到二月(给你28.0229.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);