none
LINQ Abfrage Summe alle 5 Minuten RRS feed

  • Frage

  • Hallo zusammen,

    kann mir einer sagen wie eine Abfrage aussehen kann/muss, um eine Liste wie folgt

    ENDTIME	                           COMP
    2015-04-29 09:08:46.000         112
    2015-04-29 09:08:42.000         168
    2015-04-29 09:08:40.000      	196
    2015-04-29 09:08:26.000      	112
    2015-04-29 09:07:19.000      	56
    2015-04-29 09:07:09.000      	532
    2015-04-29 09:06:58.000      	476
    2015-04-29 09:06:46.000      	308
    2015-04-29 09:06:46.000      	112
    2015-04-29 09:06:43.000      	168
    2015-04-29 09:06:32.000      	196
    2015-04-29 09:06:16.000      	112
    2015-04-29 09:05:14.000      	56
    2015-04-29 09:05:00.000      	532
    2015-04-29 09:04:50.000      	476
    2015-04-29 09:04:47.000      	308
    2015-04-29 09:04:44.000      	168

    so aufzubereiten, dass ich eine Summe der COMP jede Minute zusammengefasst bekomme?

    z.B. 

    2015-04-29 09:04:00.000        952
    Später möchte ich auch alle 5 Minuten zusammenfassen.
    • Bearbeitet David Stania Mittwoch, 29. April 2015 07:30 Erweiterung
    Mittwoch, 29. April 2015 07:27

Antworten

  • Meine Lösung dafür schaut wie folgt aus

    //Startzeit der Abfrage definieren
                DateTime datHistorie = DateTime.Now.AddHours(-48);
    
                //Abfrage ausführen
                var Komponenten = DBContext.PCBTRACE.Where(r => r.ENDTIME >= datHistorie).OrderBy(r => r.ENDTIME);
    
                //Datatable zum speichern der Abfragen
                DataTable dt = new DataTable();
                dt.Columns.Add("Datum", typeof(DateTime));
                dt.Columns.Add("Summe", typeof(decimal));
                dt.Columns.Add("CPh", typeof(decimal));
    
                //Größten Datumswert ermitteln
                var datMax = Komponenten.Max(r => r.ENDTIME).Value;
    
                //Minutenschritte definieren
                int datSchritt = 15;
    
                //Startdatum für Gruppierung/Summierung definieren
                DateTime datTempStart = Komponenten.Min(r => r.ENDTIME).Value.Round(SpecialFunctions.RoundType.QuaterHour);
                DateTime datTempEnde;
    
                while (datTempStart < datMax)
                {
                    //Enddatum für Gruppierung/Summierung definieren
                    datTempEnde = datTempStart.AddMinutes(datSchritt);
    
                    //Abfrage ausführen
                    var cphTemp = Komponenten.Where(r => r.ENDTIME >= datTempStart && r.ENDTIME < datTempEnde);
    
                    //prüfen ob Datensätze vorhanden
                    if (cphTemp.Count() > 0)
                    {
                        //Daten in Datatable einfühgen
                        dt.Rows.Add(datTempEnde,
                                    cphTemp.Sum(r => r.NUMCOMP).GetValueOrDefault(),
                                    cphTemp.Sum(r => r.NUMCOMP).GetValueOrDefault() * (60 / datSchritt));
                    }
                    else
                    {
                        dt.Rows.Add(datTempEnde, 0, 0);
                    }
                    // Neues Startdatum festlegen
                    datTempStart = datTempStart.AddMinutes(datSchritt);
                }
    
    
                dataGridView1.DataSource = dt;

    Donnerstag, 30. April 2015 08:13

Alle Antworten

  • Hi,

    für Linq kann ich dir das grade nicht sagen aber evtl. hilft dir auch die T-SQL Entsprechung.

    SELECT   DATEPART( YEAR, ENDTIME )          AS [Year],
             DATEPART( MONTH, ENDTIME )         AS [Month],
             DATEPART( DAY, ENDTIME )           AS [Day],
             DATEPART( HOUR, ENDTIME )          AS [Hour],
             ( DATEPART( MINUTE, ENDTIME ) / 1 ) AS [MinuteInterval],
             SUM( COMP ) AS SumComp
    FROM     <Tabelle>
    GROUP BY DATEPART( YEAR, ENDTIME ),
             DATEPART( MONTH, ENDTIME ),
             DATEPART( DAY, ENDTIME ),
             DATEPART( HOUR, ENDTIME ),
             ( DATEPART( MINUTE, ENDTIME ) / 1 )

    Die Idee dazu kommt von diesem Beitrag:

      http://stackoverflow.com/questions/5002661/how-to-group-time-by-hour-or-by-10-minutes


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 29. April 2015 08:17
    Moderator
  • Hallo Stefan,

    danke für deine Antwort.

    Ich nutze hier das EntityFramework und darf keine Änderungen an der DB vornehmen. Ich habe es nun mit herkömmlichen Mitteln hinbekommen ohne LINQ :-(

    Ich hatte die Hoffnung mit wenigen Zeilen Code die Lösung zu schaffen. Nun sind es ein paar mehr geworden :-)

    Danke und Gruß.

    Mittwoch, 29. April 2015 13:24
  • Hi,

    es wäre natürlich nett, wenn Du uns deine Lösung zeigen könntest. Das würde anderen Usern, die eine ähnliche Frage habe, sicher helfen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 29. April 2015 14:03
    Moderator
  • Meine Lösung dafür schaut wie folgt aus

    //Startzeit der Abfrage definieren
                DateTime datHistorie = DateTime.Now.AddHours(-48);
    
                //Abfrage ausführen
                var Komponenten = DBContext.PCBTRACE.Where(r => r.ENDTIME >= datHistorie).OrderBy(r => r.ENDTIME);
    
                //Datatable zum speichern der Abfragen
                DataTable dt = new DataTable();
                dt.Columns.Add("Datum", typeof(DateTime));
                dt.Columns.Add("Summe", typeof(decimal));
                dt.Columns.Add("CPh", typeof(decimal));
    
                //Größten Datumswert ermitteln
                var datMax = Komponenten.Max(r => r.ENDTIME).Value;
    
                //Minutenschritte definieren
                int datSchritt = 15;
    
                //Startdatum für Gruppierung/Summierung definieren
                DateTime datTempStart = Komponenten.Min(r => r.ENDTIME).Value.Round(SpecialFunctions.RoundType.QuaterHour);
                DateTime datTempEnde;
    
                while (datTempStart < datMax)
                {
                    //Enddatum für Gruppierung/Summierung definieren
                    datTempEnde = datTempStart.AddMinutes(datSchritt);
    
                    //Abfrage ausführen
                    var cphTemp = Komponenten.Where(r => r.ENDTIME >= datTempStart && r.ENDTIME < datTempEnde);
    
                    //prüfen ob Datensätze vorhanden
                    if (cphTemp.Count() > 0)
                    {
                        //Daten in Datatable einfühgen
                        dt.Rows.Add(datTempEnde,
                                    cphTemp.Sum(r => r.NUMCOMP).GetValueOrDefault(),
                                    cphTemp.Sum(r => r.NUMCOMP).GetValueOrDefault() * (60 / datSchritt));
                    }
                    else
                    {
                        dt.Rows.Add(datTempEnde, 0, 0);
                    }
                    // Neues Startdatum festlegen
                    datTempStart = datTempStart.AddMinutes(datSchritt);
                }
    
    
                dataGridView1.DataSource = dt;

    Donnerstag, 30. April 2015 08:13