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

时间:2013-05-16 05:58:51

标签: c# mysql date datetime

在我的应用程序中,我想计算当前年份和月份相同的记录数。所以我的逻辑是将当前年份和月份与我表格中的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());
                }
         }
}

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

3 个答案:

答案 0 :(得分:5)

你应该提供一个完整的日期(一个DateTime,而不进行格式化 - 文本转换在向数据库发送参数值时几乎总是一个坏主意)并使用MySQL日期/ time函数来比较值。

例如:

string query = @"SELECT * FROM tblOrder 
                 WHERE MONTH(date_needed) = MONTH(@dateTimeNow)
                   AND YEAR(date_needed) = YEAR(@dateTimeNow)";

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

string query = @"SELECT * FROM tblOrder 
                 WHERE MONTH(date_needed) = @month
                   AND YEAR(date_needed) = @year";

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

string query = @"SELECT * FROM tblOrder 
                 WHERE date_needed >= @start AND date_needed < @end";

在这里,您将@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);

答案 1 :(得分:0)

如果你想在sql中获取行数

但需要在@dateTimeNow中传递完整日期值

SELECT Count(*) FROM tblOrder WHERE MONTH(date_column)= MONTH(@dateTimeNow) and YEAR(date_column) = YEAR(@dateTimeNow)

答案 2 :(得分:0)

如果您想在MySQL端完成所有操作,请尝试以下操作:

SELECT *
FROM tblOrder
WHERE EXTRACT(YEAR_MONTH FROM date_needed) = EXTRACT(YEAR_MONTH FROM CURRENT_DATE)

使其适合您的@dateTimeNow参数,格式为yyyy-MM(在.NET中,这表示以世纪为单位的年份,后跟短划线,后跟月份为两位数),这样:

SELECT *
FROM tblOrder
WHERE @dateTimeNow = DATE_FORMAT(date_needed, '%Y-%m')