Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按日期分组数据并将DateTime转换为Double_C#_Sql_Datagridview - Fatal编程技术网

C# 按日期分组数据并将DateTime转换为Double

C# 按日期分组数据并将DateTime转换为Double,c#,sql,datagridview,C#,Sql,Datagridview,有人能帮我吗,我现在得到了结果: 我希望Stunden列中的数据转换为Double并按日期排序 最终结果为2017年3月1日=9.0; 2017年12月13日=8.5 这是我当前的代码 q.ZPZ_LPE_ID = userID; if (db.State == ConnectionState.Closed) db.Open(); string query = "SELECT zei.ZPZ_Von, zei.ZP

有人能帮我吗,我现在得到了结果:

我希望Stunden列中的数据转换为Double并按日期排序 最终结果为2017年3月1日=9.0;
2017年12月13日=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;

                    }
                }
            }
        }
谢谢大家的帮助

mysql查询结果

如果Studen是一个时间跨度,你可以这样求和

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));

我猜你想按天分组。您可以检查是否已将日期和时间添加到
arbeitszeit
。然而,字段“von”和“bis”是无用的。这基本上是因为类设计非常糟糕。您可以拥有一个类
ArbeitsTag
,其中包含一个属性
列表
,以及一个属性
Gesamtzeit
aka
Totaltime
,您可以在其中汇总所有时间。但那是另一回事;-)

var items=newbindingList();
while(dr.Read())
{
praesenzeit pra=null;
DateTime数据=转换为ToDateTime(dr[“ZPZ_数据”);
//计算从和到的解析。不要将其存储到Präsenzzeit,因为它将被累积。因此它总是错误的。可能的解决方案是分别存储每个“阶段”,并计算从那里开始的总时间。。。
DateTime von=Convert.ToDateTime(dr[“ZPZ_von”);
如果(von.TimeOfDay<新的时间跨度(8,5,0))
von=新日期时间(von.Year,von.Month,von.Day,8,0,0);
DateTime bis=转换为ToDateTime(dr[“ZPZ_bis”);
pra=项目。第一个默认值(x=>x.ZPZ_基准==基准);
//检查是否已添加日期
如果(pra!=null)
{
pra.arbeitszeit=pra.arbeitszeit+(bis-von);
}
其他的
{
pra=新的Praesenzeit();
pra.ZPZ_基准=基准;
//DateTime gehen=DateTime.Now;
pra.arbeitszeit=bis-von;
//Convert.ToString(Convert.ToInt32(arbeitszeit));
增加项目(pra);
}
}

Stunden指的是小时吗?@Rene Vogt你有权,我来解决it@JericCruz是的,“Stunden”是德语中“hours”的意思。有没有钥匙/旗帜可以知道它是输入还是输出?我假设这是一个计时器应用程序,员工需要打卡登录或注销。这可以在sql语句中完成。所以你想按天“分组”吗?我不知道如何应用你的示例,你能看到我在数据库中的查询是如何查找的吗?你能看一下我的代码吗?我不明白我如何应用这个示例?这就是我的意思,切掉所有的绒毛。用简单类型抽象问题,。提供人们可以复制过去(而不是图片)的信息样本。使用英文名称。如果我用法语写的话,你仍然会要求澄清。你的意思是用我不熟悉的变量类型和语言重写答案吗?我只会说法语、英语、克里奥尔语和一点克林贡语。。克林贡会好吗?不幸的是,我没有为自己找到解决方案,谢谢你们的支持@拖放
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} }
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);
                        }
                    }