按日期对数据进行分组并将DateTime转换为Double

时间:2017-12-21 07:34:15

标签: c# sql datagridview

任何人都可以帮助我,我现在得到的结果是:

enter image description here

我希望Stunden列中的数据转换为Double并按日期排序 结果是01.03.2017 = 9.0;                     
13.12.2017 = 8.5;

这是我目前的代码

q.ZPZ_LPE_ID = userID;
            if (db.State == ConnectionState.Closed)
                db.Open();
            string query = "SELECT zei.ZPZ_Von, zei.ZPZ_Bis, per.LPE_Nr, zei.ZPZ_LPE_ID, zei.ZPZ_Datum, SUM (zei.ZPZ_Std100) AS ZPZ_Std100" +
                           " FROM DB.dbo.Z_PRAESENZZEIT zei INNER JOIN DB.dbo.A_PERSONAL per ON zei.ZPZ_LPE_ID = per.LPE_ID" +
                            $" WHERE zei.ZPZ_Datum BETWEEN '{dtFromDate.Value}' AND '{dtToDate.Value}' AND zei.ZPZ_LPE_ID='{userID.ToString()}' GROUP BY per.LPE_Nr, zei.ZPZ_LPE_ID, zei.ZPZ_Datum, zei.ZPZ_Von, zei.ZPZ_Bis ORDER BY zei.ZPZ_Datum, per.LPE_Nr;";

            using (SqlCommand cmd = new SqlCommand(query, db))
            {
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        var items = new BindingList<PRAESENZZEIT>();
                        while (dr.Read())
                        {
                            PRAESENZZEIT pra = new PRAESENZZEIT();

                            pra.ZPZ_Datum = Convert.ToDateTime(dr["ZPZ_Datum"]);
                            pra.ZPZ_Von = Convert.ToDateTime(dr["ZPZ_Von"]);
                            if (pra.ZPZ_Von.TimeOfDay < new TimeSpan(8, 5, 0))
                                pra.ZPZ_Von = new DateTime(pra.ZPZ_Von.Year, pra.ZPZ_Von.Month, pra.ZPZ_Von.Day, 8, 0, 0);

                            // DateTime gehen = DateTime.Now;
                            pra.ZPZ_Bis = Convert.ToDateTime(dr["ZPZ_Bis"]);
                            pra.arbeitszeit = pra.ZPZ_Bis - pra.ZPZ_Von;
                           // Convert.ToString(Convert.ToInt32(arbeitszeit));

                            items.Add(pra); 
                        }
                        pRAESENZZEITBindingSource.DataSource = items;

                    }
                }
            }
        }

这是PRAESENZEIT类

public class PRAESENZZEIT
{
    public int LPE_Nr { get; set; }
    public DateTime ZPZ_Datum { get; set; }
    public double ZPZ_Std100 { get; set; }
    public int ZPZ_LPE_ID { get; set; }

    public DateTime ZPZ_Von { get; set; }
    public DateTime ZPZ_Bis { get; set; }
    public DateTime ZPZ_Std { get; set; }

    public int ZPZ_ID { get; set; }
    public int ZPZ_Jahr { get; set; }
    public int ZPZ_Monat { get; set; }
    public int ZPZ_Tag { get; set; }
    public DateTime ZPZ_ERFDAT { get; set; }
    public string ZPZ_ERFUSER { get; set; }
    public DateTime ZPZ_MUTDAT { get; set; }
    public string ZPZ_MUTUSER { get; set; }
    public TimeSpan arbeitszeit { get; set; }
}

谢谢大家的帮助

mysql查询结果 enter image description here

2 个答案:

答案 0 :(得分:1)

如果Studen是TimeSpan,你可以用这种方式加总。

var dataSource = new List<grdata> {
     //         StartDate         , EndDate
     new grdata("01/03/2017 04:00","01/03/2017 08:00"),
     new grdata("01/03/2017 09:00","01/03/2017 14:00"),
     new grdata("13/12/2017 04:30","13/12/2017 09:00"),
     new grdata("13/12/2017 10:00","13/12/2017 14:00")
};

var opdata = dataSource.Select(x => new
{
    date = DateTime.Parse(x.start.ToShortDateString())                ,
    time = x.end-x.start
});

var result = opdata.GroupBy(x => x.date)
                    .Select(g => new
                    {
                        date = g.Key,
                        sumTime = new TimeSpan(g.Sum(y => y.time.Ticks))
                    });

var totalSum = new TimeSpan(opdata.Sum(y => y.time.Ticks));

结果:

{ date = {01/03/2017 00:00:00}, sumTime = {00:09:00} }
{ date = {13/12/2017 00:00:00}, sumTime = {00:08:30} }

答案 1 :(得分:0)

我想你想白天分组。您可以检查是否已添加当天并将时间添加到arbeitszeit。然而,字段'von'和'bis'是无用的。这基本上是因为课堂设计非常糟糕。您可以拥有一个类ArbeitsTag,其中包含一个属性List<Anwesenheit>和一个属性Gesamtzeit又名Totaltime,您可以在此总结所有时间。但这是一个不同的故事;-)

var items = new BindingList<PRAESENZZEIT>();
                    while (dr.Read())
                    {
                        PRAESENZZEIT pra = null;


                        DateTime datum = Convert.ToDateTime(dr["ZPZ_Datum"]);

                        //calculate parse from and to. Don't store it to Präsenzzeit as it will be accumulated. Therefore it will always be wrong. possible solution would be to store each "phase" separatly and calculate a Total time from there...
                        DateTime von = Convert.ToDateTime(dr["ZPZ_Von"]);
                        if (von.TimeOfDay < new TimeSpan(8, 5, 0))
                            von = new DateTime(von.Year, von.Month, von.Day, 8, 0, 0);

                        DateTime bis = Convert.ToDateTime(dr["ZPZ_Bis"]);

                         pra = items.FirstOrDefault(x => x.ZPZ_Datum == datum);
                        //check if day was already added
                        if (pra != null)
                        {
                            pra.arbeitszeit = pra.arbeitszeit + (bis - von);
                        }
                        else
                        {

                            pra = new PRAESENZZEIT();

                            pra.ZPZ_Datum = datum;

                            // DateTime gehen = DateTime.Now;

                            pra.arbeitszeit = bis - von;
                            // Convert.ToString(Convert.ToInt32(arbeitszeit));

                            items.Add(pra);
                        }
                    }