2017-12-21 12 views
1

を倍増したDateTimeを変換誰もこれで私を助けることができる、私は、現時点ではその結果を取得しています:データが日付でグループ化し、

enter image description here

私はStunden列のデータが二重に変換します日付でソート 最終結果は01.03.2017 = 9.0となります。
13.12.2017 = 8.5; Studenのは、Aの場合

これは私の現在のコード

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; 

        } 
       } 
      } 
     } 

これは

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

PRAESENZEITクラスであるが enter image description here

+0

は時間を参照してください? –

+0

@RenéVogtあなたは正しいが、私はそれを修正する – dejanm

+0

@JericCruzはい "Stunden"は "時間"のためのドイツ語です。 –

答えて

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

ヘルプ

MySQLのクエリ結果ありがとうございましたあなたがそれを合計することができますTimeSpan y。

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} } 
+0

サンプルを適用する方法がわかりません。データベース内のクエリがどのように表示されるのか分かりますか? – dejanm

+0

私のコードを見てください。私がこの例をどのように適用できるか理解していない? – dejanm

+0

これは私が[Mcve]を意味している、すべての毛羽をカット。簡単な型の問題を抽象化してください。人々が過去に(写真ではなく)コピーできる情報サンプルを提供する。英語の名前を使用してください。もし私がフランス語で書いていたのであれば、あなたは依然として明確化を求めています。 –

関連する問題