C# 提取当月日期数的SQL查询

C# 提取当月日期数的SQL查询,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我想编写一个SQL命令,从数据库中选择日期与本年同月的行数 例如:现在是2020年7月,所以我希望命令提取日期在2020年7月的行数 根据我对Stackoverflow其他答案的理解,我编写了以下C代码: cmd = new SqlCommand("SELECT COUNT(date) FROM ordertbl WHERE MONTH(date) = MONTH(GETDATE()) AND YEAR(date) = YEAR(GETDATE())", con); d

我想编写一个SQL命令,从数据库中选择日期与本年同月的行数

例如:现在是2020年7月,所以我希望命令提取日期在2020年7月的行数

根据我对Stackoverflow其他答案的理解,我编写了以下C代码:

 cmd = new SqlCommand("SELECT COUNT(date) FROM ordertbl WHERE MONTH(date) = MONTH(GETDATE()) AND YEAR(date) = YEAR(GETDATE())", con);

 dr = cmd.ExecuteReader();
 dr.Read();

 lblthismonth.Text = dr[0].ToString();
 dr.Close();

带有日期的列称为date。

最好不要操纵表数据。改为搜索计算范围:

SELECT COUNT(date)
FROM ordertbl 
WHERE 
  date >= CAST(DATEADD(DAY, 1, EOMONTH(GETDATE(),-1)) AS DATE) and
  date < CAST(DATEADD(DAY, 1, EOMONTH(GETDATE())) AS DATE)
在查询中,如果有一百万行,其中100000行匹配,sqlserver必须执行200万个日期操作,从一百万个日期中提取年份和月份,然后进行200万次比较,比较提取的数字。无法使用索引

如果您计算出一个日期范围,并且列被索引,那么sqlserver可以使用索引数据,因为它没有被操作,并且知道要检索哪些100000行。在这种计数的情况下,它甚至不需要敲桌子;它可以只计算索引


通常,我们应该尽量避免将函数调用放在WHERE子句中比较运算符的左侧,最好不要操作表数据。改为搜索计算范围:

SELECT COUNT(date)
FROM ordertbl 
WHERE 
  date >= CAST(DATEADD(DAY, 1, EOMONTH(GETDATE(),-1)) AS DATE) and
  date < CAST(DATEADD(DAY, 1, EOMONTH(GETDATE())) AS DATE)
在查询中,如果有一百万行,其中100000行匹配,sqlserver必须执行200万个日期操作,从一百万个日期中提取年份和月份,然后进行200万次比较,比较提取的数字。无法使用索引

如果您计算出一个日期范围,并且列被索引,那么sqlserver可以使用索引数据,因为它没有被操作,并且知道要检索哪些100000行。在这种计数的情况下,它甚至不需要敲桌子;它可以只计算索引


通常,我们应该尽量避免将函数调用放在WHERE子句中比较运算符的左侧

代码有什么问题?和?当你运行它时会发生什么?它工作吗?你有没有试过,结果出乎意料?你们有什么问题?我很抱歉。我刚刚意识到我在同一个月内没有任何记录。对不起,我粗心了。但是我想我应该为那些有同样疑问的人保留答案。SELECT COUNTdate返回一个标量,而不是一个集合。你应该使用,而不是ExecuteReader。你的代码有什么问题?和?当你运行它时会发生什么?它工作吗?你有没有试过,结果出乎意料?你们有什么问题?我很抱歉。我刚刚意识到我在同一个月内没有任何记录。对不起,我粗心了。但是我想我应该为那些有同样疑问的人保留答案。SELECT COUNTdate返回一个标量,而不是一个集合。您应该使用,而不是ExecuteReader。