2014-01-19 93 views
0

我目前正在嘗試通過選擇SQL語句來執行一個組。我想要做的是在一年內有12個月。在一個月內,我總結了所有傳出的項目並將其顯示爲條形圖。下面是我如何設置我的SQL語句:在SQL語句中按月分組

public List<ProductPacking> getSumProductByMonth(string prodName) 
    { 
     List<ProductPacking> ft = new List<ProductPacking>(); 

     using (var connection = new SqlConnection(FoodBankDB.connectionString)) 
     { 
      SqlCommand command = new SqlCommand("SELECT SUM(Convert(INT, ddi.productQuantity)) AS totalQuantity, p.name, month(d.deliveryDate) AS deliveryMonth FROM dbo.DistributionDistributedItems ddi " + 
       " INNER JOIN dbo.ProductVariants pv ON ddi.productVariant = pv.id " + 
       " INNER JOIN dbo.Products p ON pv.product = p.id " + 
       " INNER JOIN dbo.Distributions d ON ddi.distribution = d.id " + 
       " WHERE p.name = '" + prodName + "' AND year(deliveryDate) < GETDATE() " + 
       " GROUP BY p.name, month(d.deliveryDate)", connection); 
      connection.Open(); 
      using (var dr = command.ExecuteReader()) 
      { 
       while (dr.Read()) 
       { 
        DateTime deliveryMonth = DateTime.ParseExact(dr["deliveryMonth"].ToString(), "MMMM", CultureInfo.InvariantCulture); 
        ft.Add(new ProductPacking(Convert.ToInt32(dr["totalQuantity"].ToString()), deliveryMonth)); 
       } 
      } 
     } 
     return ft; 
    } 

在調試模式下,它返回我deliveryMonth爲1/1/0001 12:00:00 AM這是不正確的。我確信我在數據庫中存儲了正確的日期格式。我測試了查詢並返回了正確的數據。只是日期格式有誤。

我試圖格式化日期爲一月,二月等等。但是,它返回了一條錯誤消息,即String未被識別爲有效的DateTime。我想知道爲什麼會這樣,因爲我設法按年來解析,這是我的另一個功能。

在此先感謝。

+1

'一個月(d.deliveryDate)'返回一個帶有月份數的「int」。您無法將其直接轉換爲DateTime,因爲它缺少年/日。 – wdosanjos

回答

0

按月名稱中使用DATENAME功能對數據進行分組更改您的SQL語句:

SqlCommand command = new SqlCommand("SELECT SUM(Convert(INT, ddi.productQuantity)) AS totalQuantity, p.name, DATENAME(MONTH,d.deliveryDate) AS deliveryMonth FROM dbo.DistributionDistributedItems ddi " + 
    " INNER JOIN dbo.ProductVariants pv ON ddi.productVariant = pv.id " + 
    " INNER JOIN dbo.Products p ON pv.product = p.id " + 
    " INNER JOIN dbo.Distributions d ON ddi.distribution = d.id " + 
    " WHERE p.name = '" + prodName + "' AND year(deliveryDate) < GETDATE() " + 
    " GROUP BY p.name, DATENAME(MONTH,d.deliveryDate)", connection); 

,並通過dr["deliveryMonth"]ProductPacking構造:

while (dr.Read()) 
{ 
    ft.Add(new ProductPacking(Convert.ToInt32(dr["totalQuantity"].ToString()), dr["deliveryMonth"].ToString())); 
} 
+0

但它一直在回我一月,儘管我在查詢中測試過,有兩個結果是12月和1月 –

+1

您的'WHERE'子句看起來不正確。嘗試'year(deliveryDate) wdosanjos

+0

year(deliveryDate)