如何只获得比较日期的年份和月份?

Har*_*vey 1 c# mysql datetime date

在我的应用程序中,我想计算当前年和月相同的记录数.所以我的逻辑是将当前年份和月份与我表格中的date_needed列进行比较.我是这样做的:

using (MySqlConnection con = new MySqlConnection(serverstring))
{
         con.Open();
         string query = "SELECT * FROM tblOrder WHERE date_needed=@dateTimeNow";
         using (MySqlCommand cmd = new MySqlCommand(query, con))
         {
               cmd.Parameters.AddWithValue("@dateTimeNow", DateTime.Now.ToString("yyyy-MM"));             using (MySqlDataReader dr = cmd.ExecuteReader())
               {
                      int count = 0;
                      while (dr.Read())
                      {
                          count++;
                      }
                      MessageBox.Show(count.ToString());
                }
         }
}
Run Code Online (Sandbox Code Playgroud)

我知道它不起作用,因为在我的消息框中它显示零而不是一条记录.您认为这个问题是什么?

Jon*_*eet 5

你应该提供一个完整的日期(作为一个DateTime,没有格式化 - 文本转换几乎总是一个坏主意,当发送参数值到数据库)并使用MySQL日期/时间函数来比较值.

例如:

string query = @"SELECT * FROM tblOrder 
                 WHERE MONTH(date_needed) = MONTH(@dateTimeNow)
                   AND YEAR(date_needed) = YEAR(@dateTimeNow)";
Run Code Online (Sandbox Code Playgroud)

或者,您可以将月份和年份作为单独的参数传递:

string query = @"SELECT * FROM tblOrder 
                 WHERE MONTH(date_needed) = @month
                   AND YEAR(date_needed) = @year";
Run Code Online (Sandbox Code Playgroud)

或者 - 可能更具性能 - 您可以给出起点和终点:

string query = @"SELECT * FROM tblOrder 
                 WHERE date_needed >= @start AND date_needed < @end";
Run Code Online (Sandbox Code Playgroud)

在这里,您将设置@start为本月@end的开始,以及下个月的开始.你可以把它们当作:

// Consider using UtcNow.Date instead. Basically, think about time zones.
DateTime today = DateTime.Today;
DateTime start = new DateTime(today.Year, today.Month, 1);
DateTime end = start.AddMonths(1);
Run Code Online (Sandbox Code Playgroud)