C# SQL语句中的按月分组

C# SQL语句中的按月分组,c#,asp.net,sql-server,datetime,group-by,C#,Asp.net,Sql Server,Datetime,Group By,我目前正在尝试使用select SQL语句进行分组。我想做的是一年内有12个月的时间。在一个月内,我总结了所有外出项目,并显示为条形图。下面是我如何设置SQL语句的: public List<ProductPacking> getSumProductByMonth(string prodName) { List<ProductPacking> ft = new List<ProductPacking>(); using

我目前正在尝试使用select SQL语句进行分组。我想做的是一年内有12个月的时间。在一个月内,我总结了所有外出项目,并显示为条形图。下面是我如何设置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;
    }
公共列表getSumProductByMonth(字符串prodName)
{
List ft=新列表();
使用(var connection=newsqlconnection(FoodBankDB.connectionString))
{
SqlCommand command=new SqlCommand(“从dbo.DistributionDistributedItems ddi中选择SUM(Convert(INT,ddi.productQuantity))作为totalQuantity,p.name,month(d.deliveryDate)作为deliveryMonth”+
“ddi.productVariant=pv.id上的内部联接dbo.ProductVariants pv”+
“内部联接dbo.Products p ON pv.product=p.id”+
“ddi.distribution=d.id上的内部联接dbo.Distributions d”+
其中p.name=“+prodName+”,年份(deliveryDate)
在调试模式下,它将deliveryMonth返回为1/1/0001 12:00:00 AM,这是不正确的。我确信我在数据库中存储了正确的日期格式。我测试了查询,它返回了正确的数据。只是日期格式有误

我尝试将日期设置为1月、2月等。但是,它会返回一条错误消息,即字符串未被识别为有效的日期时间。我想知道为什么会这样,因为我设法按年解析,这是我的另一个函数


提前感谢。

使用函数更改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);

month(d.deliveryDate)
返回一个带有月数的
int
。您无法将其直接转换为日期时间,因为它缺少年/日。但它一直返回我一月。尽管我在查询中进行了测试,但有两个结果是十二月和一月。您的
WHERE
子句看起来不正确。尝试
year(deliveryDate)
deliveryDate
而不是
year(deliveryDate)
。year(deliveryDate)最后,它应该是
year(deliveryDate)
它可以工作。但这只是前几年的记录。有没有办法显示超过一年的时间?因为我确实通过删除where子句中的“年份”得到了2013年12月和2014年1月的记录。但它只是在一月份和二月份都持续出现
while (dr.Read())
{
    ft.Add(new ProductPacking(Convert.ToInt32(dr["totalQuantity"].ToString()), dr["deliveryMonth"].ToString()));
}