【问题标题】:Data grouping by date and converting DateTime to Double按日期分组数据并将 DateTime 转换为 Double
【发布时间】:2017-12-21 07:34:14
【问题描述】:

谁能帮帮我,我现在得到结果:

我希望将 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查询结果

【问题讨论】:

  • Stunden 指的是小时吗?
  • @RenéVogt 你有权利,我会修复它
  • @JericCruz 是的,“Stunden”是德语的“小时”。
  • 是否有一个键/标志来知道它是输入还是输出?我假设它是一个计时器应用程序,员工需要打卡登录或退出。这可以在sql语句中完成
  • 所以你想“GROUP BY”一天?

标签: c# sql datagridview


【解决方案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} }

【讨论】:

  • 我不明白如何应用你的例子,你能看到我在数据库中的查询是如何查找的
  • 你能看看我的代码吗,我不明白如何应用这个例子?
  • 这就是我所说的minimal reproducible example,切掉所有的绒毛。用简单类型抽象问题。提供人们可以复制过去的信息样本(不是图片)。使用英文名称。如果我是用法语写的,你仍然会要求澄清。
  • 你的意思是用我不熟悉的变量类型和语言重写那个答案吗?我只精通法语、英语、克里奥尔语和一点克林贡语……克林贡语会好吗?
  • 很遗憾,我没有为自己找到解决方案,感谢您的支持! @拖放
【解决方案2】:

我猜你想按天分组。您可以检查是否已添加日期并将时间添加到arbeitszeit。但是,“von”和“bis”字段是无用的。这基本上是因为类设计非常糟糕。你可以有一个类ArbeitsTag,它包含一个属性List&lt;Anwesenheit&gt;和一个属性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);
                        }
                    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2013-12-15
    • 2017-07-28
    • 2019-03-08
    • 1970-01-01
    相关资源
    最近更新 更多