C# SQL语句中的按月分组
我目前正在尝试使用select SQL语句进行分组。我想做的是一年内有12个月的时间。在一个月内,我总结了所有外出项目,并显示为条形图。下面是我如何设置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
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()));
}