sql
  • date
  • razor
  • 2016-12-02 12 views 0 likes 
    0

    データベースから何週間にもわたってデータを選択できますか? 違いがあれば、私はcshtml(MVCではなく)とwebmatrixを使用します。SQL週単位でデータを選択する方法

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

    だから、今、私はこれを使用していて、私は開始日(例:2016年11月1日)に入れ、終了日(例:2016年11月30日)(YYYY-MM-DDのcuz北ヨーロッパ)。これは、これらの日付の間にデータベース内のすべてのデータを表示しますが、データベースのすべての行は日付のみの日付を持つため、表示される結果は日の形式になります。この場合、一例として、11月1日から最後までは、4週間かかる可能性がありますか?また、データベースのデータはint値ですので、意味がある場合は表示される合計週を表示するようにそれらを追加することができます。

    たとえば、

    column 1 column 2 column 3 
    
    5 . . . . 6 . . 2016-11-13 
    
    8 . . . . 10 . . 2016-11-15 
    
    6 . . . . 3 . . 2016-11-17 
    

    だから、今のようには、3日目のための2日目と9のための1日目、18のための11の合計で3日間を表示していましたが、数週間の面で表示されている間、それは次のようになり11 + 18 + 9 = 38である。これは始めることさえできないかもしれませんが、私は可能な限りこれを行う方法を知りたいと思います!

    これは可能な解決策ではない場合は、日の形式ですべてのデータを選択したり、配列などに入れたり、そこから週の合計に基づいて週単位の合計としてグループ化したり年(例えば11月は44-48週を含む)のようなものがありますか?私が言っていることは、最終結果が私が望むものなら、それがどのように成し遂げられたかは関係ありません。あなたのコメントから

    @{ 
    //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

    どのdbmsを使用していますか? (日付/時刻に関しては、多くの製品がANSI SQL準拠のものにはほど遠いです。) – jarlh

    +0

    それはどういう意味なのか正確にはわかりませんが、.sdfデータベースがあります。作成してテーブルを作成し、列に名前を付けていくつかのボックスをチェックしました。日付はdatetimeとして保存されます。これがあなたの質問に答えるかどうか分かりませんか? –

    答えて

    0

    1あなたはMSSQLサーバーのコンパクト版を使用している締結することができます。

    これが正しい場合、DATEPART関数を使用して、各日付の年の週を抽出し、週ごとにグループ化し、それぞれのすべての結果を合計することができます。このような

    何か:{運動}と{weekNumber}は、置換される変数である

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

    またはこのような、あなたが一度に複数の週を要求する必要がある場合:

    {行使}と{listOfWeekNumbers}は、置換する変数です
    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) 
    

    どちらの場合でも、私たちが週の数について話すとき、私たちは整数値について話します。 1は、第二週年の最初の週、2を意味し、...

    例:あなたは週番号に日付を変換する必要があり、このSQLを使用するために、だから、1月

    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) 
    

    の値を取得します。 MSDNの

    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:あなたが唯一のdateFromdateToを持っているなら、あなたはこのような何かを試すことができます。

    +0

    これを正しく実装する方法として少し混乱しています。 私はこれを次のように書いています::: var dbQueryAllVariants = "SELECT DATEPART(week、date)AS weekNumber、sum(kg)+ sum(sett)AS grandTotalPerWeek from WHEREエクササイズ=" +エクササイズ+ "AND DATEPART(週、日付)IN "+ fromDate +" GROUP BY DATEPART(週、日付) "; 私が変えなければならないことについてわからない変数は、1つ、2つまたは3つの運動であり、次に2つの異なる日付ピッカーに入力する開始日と終了日です。列1は「kg」と列2「sett」と呼ばれ、格納されたdatetimeはdb内の「date」です。 –

    +0

    主な答えを変更しました –

    +0

    var dbQueryAllVariants = "SELECT DATEPART(week、date)AS weekNumber、sum(kg)+ sum(sett)AS grandTotalPerWeek FROMテストWHERE練習=" +エクササイズ+ "およびDATEPART(曜日、日付) (week、 "+ fromDate +")AND DATEPART(week、 "+ toDate +")GROUP BY DATEPART(week、date) ";私は、ページ全体を掲載 –

    関連する問題