2016-12-02 8 views
0

Ist es in irgendeiner Weise möglich, Daten aus der Datenbank in Wochenspannen auszuwählen? Ich benutze cshtml (nicht MVC) und Webmatrix, wenn das einen Unterschied macht.SQL Wie wählt man Daten in Wochen aus?

var dbQueryAllVariants = "SELECT * FROM Test WHERE exercise = " + exercise + " AND date >= '" + fromDate + "' AND date <= '" + toDate + "'"; 

So jetzt ich dies verwenden, die ich in einem Startdatum setzen (ex. 2016.11.01) und Enddatum (ex. 2016.11.30) (yyyy-mm-dd Cuz Nordeuropa). Dies zeigt alle Daten in der Datenbank zwischen diesen Daten an, aber da alle Zeilen in der Datenbank nur einen Tag als Datum haben, würde das zu betrachtende Ergebnis in Tagesform sein. Ich möchte, wenn es Wochen machen kann, in diesem Fall vom ersten bis letzten November als Beispiel wären ca. 4 Wochen, ist das möglich? Außerdem sind die Daten in der Datenbank int-Werte, so dass ich in der Lage wäre, diejenigen hinzuzufügen, die die gesamte angezeigte Woche anzeigen, wenn dies sinnvoll ist.

Zum Beispiel.

column 1 column 2 column 3 

5 . . . . 6 . . 2016-11-13 

8 . . . . 10 . . 2016-11-15 

6 . . . . 3 . . 2016-11-17 

So wie jetzt davon 3 Tage mit einer Summe von 11 für Tag 1, 18 für Tag 2 und 9 für Tag 3 angezeigt werden würde, aber während in Wochen angezeigt würde es 11 + 18 sein + 9 = 38, wie für ein Beispiel. Dies ist vielleicht nicht einmal möglich, aber ich würde gerne wissen, wie das geht, wenn möglich!

Wenn dies keine mögliche Lösung ist, gibt es eine Möglichkeit, wie Sie alle Daten in Tagesform auswählen, in einem Array oder was auch immer, und von dort senden Sie es als wöchentliche Summe basierend auf den Wochen gruppiert das Jahr (ex. November enthält Woche 44-48) so etwas? Was ich versuche zu sagen ist, dass, wenn das Endergebnis ist, was ich will, es egal ist, wie es gemacht wird.

@{ 
//Calls for my website layout. 
Layout = "~/_SiteLayout.cshtml"; 
//Browser title of the specific page. 
Page.Title = "TEST"; 

//Opens database. 
var db = Database.Open("SmallBakery"); 

//Variables. 
var exercise = Request.Form["Exercise"]; 
var fromDate = Request.Form["fromDate"]; 
var toDate = Request.Form["toDate"]; 
var exerVariName = ""; 
var exerVariNameS = ""; 
var exerVariNameB = ""; 
var exerVariNameD = ""; 
//Defaults to show data between these 
//dates if user dont choose any dates. 
var noStartDate = "1970-01/01"; 
var noEndDate = "2099-12/31"; 


//If user does not choose eiter/any start/end date 
//this will end up showing all results possible. 
if (fromDate == "") { 
    fromDate = noStartDate; 
} 
if (toDate == "") { 
    toDate = noEndDate; 
} 

//Takes exerVariName from different dropdowns 
//depending on which exercise is selected due to 
//the fact that only one dropdown is visible at any time. 
if (exercise == "1") { 
    exerVariName = Request.Form["exerVariNameS"]; 
} else if (exercise == "2") { 
    exerVariName = Request.Form["exerVariNameB"]; 
} else { 
    exerVariName = Request.Form["exerVariNameD"]; 
} 

//Gets exercise variants to the dropdown menu. 
var getSVariName = "SELECT * FROM exerciseVariants WHERE exerVariNameID = 1 ORDER BY exerVariName"; 
var getBVariName = "SELECT * FROM exerciseVariants WHERE exerVariNameID = 2 ORDER BY exerVariName"; 
var getDVariName = "SELECT * FROM exerciseVariants WHERE exerVariNameID = 3 ORDER BY exerVariName"; 
var getData = "SELECT * FROM Test"; 

//Gets the date. 
var getDate = "SELECT date FROM Test"; 
} 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title></title> 
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> 
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
</head> 
<body> 
    <!-- Form for posting. --> 
    <form method="post" action=""> 
     <!-- Radio buttons to select which data to show. --> 
     <div> 
      <label>Squat</label> 
      <input type="radio" name="Exercise" id="hej1" value="1" /> 
     </div> 
     <div> 
      <label>Benchpress</label> 
      <input type="radio" name="Exercise" id="hej2" value="2" /> 
     </div> 
     <div> 
      <label>Deadlift</label> 
      <input type="radio" name="Exercise" id="hej3" value="3" /> 
     </div> 
     <div> 
      <!-- Dropdown menu with squat-variant-names. --> 
      <select id="exerVariNameS" name="exerVariNameS"> 
       <option value="all">All</option> 
       <option value="Comp">Competition</option> 
       @foreach (var get in db.Query(getSVariName)) { 
        //Gets the exercise variation names from 
        //the database and puts them in a dropdown. 
        <option value="@get.exerVariName">@get.exerVariName</option> 
       } 
      </select> 
      <!-- Dropdown menu with bench-variant-names. --> 
      <select id="exerVariNameB" name="exerVariNameB"> 
       <option value="all">All</option> 
       <option value="Comp">Competition</option> 
       @foreach (var get in db.Query(getBVariName)) { 
        //Gets the exercise variation names from 
        //the database and puts them in a dropdown. 
        <option value="@get.exerVariName">@get.exerVariName</option> 
       } 
      </select> 
      <!-- Dropdown menu with deadlift-variant-names. -->    
      <select id="exerVariNameD" name="exerVariNameD"> 
       <option value="all">All</option> 
       <option value="Comp">Competition</option> 
       @foreach (var get in db.Query(getDVariName)) { 
        //Gets the exercise variation names from 
        //the database and puts them in a dropdown. 
        <option value="@get.exerVariName">@get.exerVariName</option> 
       } 
      </select> 
     </div> 
     <div> 
      <!-- Date calendar. --> 
      <input placeholder="From date..." type="text" class="datepicker" name="fromDate" value="@fromDate"> 
     </div> 
     <div> 
      <!-- Date calendar. --> 
      <input placeholder="To date..." type="text" class="datepicker" name="toDate" value="@toDate"> 
     </div> 
     <!-- The submit button. --> 
     <input type="submit" value="Show" class="submit" /> 
    </form> 

    <!-- Displays database value on submit click based on choosen radiobutton from form-post above. --> 
    @if (IsPost) { 
     //When I select ALL in the dropdown it runs 
     //this line because there is no filter for 'exerVariName'. 
    //  var dbQueryAllVariants = "SELECT * FROM Test WHERE exercise = " + exercise + " AND date >= '" + fromDate + "' AND date <= '" + toDate + "'"; 
     //When I select a specific exercise variation. 
     var dbQuerySingleVariant = "SELECT * FROM Test WHERE exercise = " + exercise + " AND exerVariName = '" + exerVariName + "' AND date >= '" + fromDate + "' AND date <= '" + toDate + "'"; 


     //This is what the problem is.... 
     var dbQueryAllVariants = "SELECT DATEPART(week, date) AS weekNumber, sum(kg)+sum(sett) AS grandTotalPerWeek FROM Test WHERE Exercise = " + exercise + " AND DATEPART(week, date) BETWEEN DATEPART(week, " + fromDate + ") AND DATEPART(week, " + toDate + ") GROUP BY DATEPART(week, date)"; 


     var dbQuery = ""; 
     //If dropdown = select all, it does, else, it show the one I pick. 
     if (exerVariName == "all") { 
      dbQuery = dbQueryAllVariants; 
     } else { 
      dbQuery = dbQuerySingleVariant; 
     } 
     //Foreach to write out all the data from db. 
     var sumTotalWeight = 0; 
     foreach (var get in db.Query(dbQuery)) { 
      <a>Weight: </a> 
      <a>@get.Kg kg</a> 
      <a> Sets: </a> 
      <a>@get.Sett</a> 
      <a> Reps: </a> 
      <a>@get.Rep</a> 
      <a> Total reps: </a>@(get.Sett * get.Rep) 
      <a> @get.date</a> 

      var totalWeight = @get.Kg * @get.Sett * @get.Rep; 
      sumTotalWeight += totalWeight; 
      <a> @totalWeight</a> 
      <br> 
     } 
     @sumTotalWeight       
    } 
</body> 

+0

Welche DBMS verwenden Sie? (Wenn es um Datum/Zeit geht, sind viele Produkte weit entfernt von ANSI SQL.) – jarlh

+0

Während ich nicht genau weiß, was das bedeutet, habe ich eine .sdf-Datenbank, ich habe es nicht selbst mit Text codiert, wie ich weiß, ist möglich, ich nur geklickt create, create table, benannte die Spalten und checkte einige Boxen. Und Datum wird als Datetime gespeichert. Nicht sicher, ob das deine Frage beantwortet? –

Antwort

0

Von Ihren Kommentaren schließen ein können Sie die MSSQL Server Compact Edition verwenden.

Wenn das korrekt ist, können Sie die Funktion DATEPART verwenden, um die Woche des Jahres für jedes Datum zu extrahieren, und dann nach Woche gruppieren und alle Ergebnisse für jedes Datum summieren.

Etwas wie folgt aus:

SELECT 
    sum(column1)+sum(column2) AS grandTotalPerWeek 
FROM Test 
WHERE Exercise = {Exercise} 
AND DATEPART(week, date) = {weekNumber} 

Wo {Übung} und {} Wochennummer sind die Variablen ersetzt werden.

Oder so, wenn Sie mehrere Wochen beantragen müssen:

SELECT 
    DATEPART(week, date) AS weekNumber, 
    sum(column1)+sum(column2) AS grandTotalPerWeek 
FROM Test 
WHERE Exercise = {Exercise} 
AND DATEPART(week, date) IN ({listOfWeekNumbers}) 
GROUP BY DATEPART(week, date) 

Wo {Übung} und {} listOfWeekNumbers sind die Variablen ersetzt werden.

In jedem Fall, wenn wir über Wochenzahlen sprechen, sprechen wir über ganzzahlige Werte. 1 bedeutet, die erste Woche des Jahres, 2 der zweiten Woche ...

Beispiel:

SELECT 
    DATEPART(week, date) AS weekNumber, 
    sum(kg)+sum(sett) AS grandTotalPerWeek 
FROM Test 
WHERE Exercise = 1 
AND DATEPART(week, date) IN (1,2,3,4) 
GROUP BY DATEPART(week, date) 

also die Werte für den Monat Januar Erhalten Sie dieses SQL Sie Daten in Woche Zahlen übersetzen, verwenden müssen. Wenn Sie nur dateFrom haben und dateTo dann können Sie so etwas wie dies versuchen:

SELECT 
    DATEPART(week, date) AS weekNumber, 
    sum(kg)+sum(sett) AS grandTotalPerWeek 
FROM Test 
WHERE Exercise = 1 
AND DATEPART(week, date) BETWEEN DATEPART(week, {dateFrom}) AND DATEPART(week, {dateTo}) 
GROUP BY DATEPART(week, date) 

DATEPART documentation auf MSDN.

+0

Ich bin etwas verwirrt, wie dies richtig zu implementieren ist. Ich sage es so ::: var dbQueryAllVariants = "SELECT DATEPART (Woche, Datum) AS WocheNummer, Summe (kg) + Summe (sett) AS grandTotalPerWeek VON Test WHERE Übung =" + Übung + "UND DATEPART (Woche, Datum) IN "+ fromDate +" GROUP BY DATEPART (Woche, Datum) "; nicht sicher über die Dinge, die ich ändern sollte, Die Variablen, die ich habe, ist Übung, die 1, 2 oder 3 ist, dann ein Startdatum und ein Enddatum, die ich in zwei verschiedenen datepickers eingeben. Und Spalte 1 wird 'kg' und Spalte 2 'set' genannt, und gespeicherte datetime ist 'date' in der db. –

+0

Die Hauptantwort wurde geändert. –

+0

var dbQueryAllVariants = "SELECT DATEPART (Woche, Datum) AS Wochenzahl, Summe (kg) + Summe (Einstellung) AS grandTotalPerWeek FROM Test WHERE Übung =" + Übung + "UND DATEPART (Woche, Datum) ZWISCHEN DATEPART (Woche, "+ fromDate +") UND DATEPART (woche, "+ toDate +") GROUP BY DATEPART (woche, datum) "; –

Verwandte Themen