【问题标题】:How to get only the year and month part of a date to compare?如何仅获取日期的年份和月份部分进行比较?
【发布时间】:2013-05-10 21:44:56
【问题描述】:

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

我知道它不起作用,因为在我的消息框中它显示为零而不是一条记录。你觉得问题出在哪里?

【问题讨论】:

  • 您想在 SQL 或 C# 中比较它的位置
  • date_needed真的是一个以yyyy-MM格式存储日期的varchar字段吗?
  • @RajeevKumar,我想比较mySQL数据库表tblOrderdate_needed列中的当前时间,所以我有这个查询string query = "SELECT * FROM tblOrder WHERE date_needed=@dateTimeNow";
  • @V4Vendetta 不,它是date 格式。
  • 我想那将无法正常工作,您必须将 LHS date_needed 格式化为您传递的格式,例如 DATE_FORMAT(fieldname,"%Y-%m")

标签: c# mysql date datetime


【解决方案1】:

您应该提供完整的日期(as DateTime,不对其进行格式化 - 将参数值发送到数据库时,文本转换几乎总是一个坏主意)并使用 MySQL 日期/时间比较值的函数。

例如:

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);

【讨论】:

    【解决方案2】:

    如果您想获取 sql 中的行数,请使用

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

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

    【讨论】:

      【解决方案3】:

      如果你想在 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')
      

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多