2013-05-16 2 views
0

В моем приложении я хочу подсчитать количество записей с тем же текущим годом и месяцем. Поэтому моя логика заключается в сравнении текущего года и месяца с столбцом date_needed в моей таблице. Вот как я это сделал:Как получить только год и месяц часть даты для сравнения?

using (MySqlConnection con = new MySqlConnection(serverstring)) 
{ 
     con.Open(); 
     string query = "SELECT * FROM tblOrder WHERE [email protected]"; 
     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()); 
       } 
     } 
} 

Я знаю, что это не работает, потому что в моем MessageBox он показывает ноль вместо одной записи. Как вы думаете, в чем проблема?

+0

Где вы хотите сравнить его в SQL или C# –

+0

Является ли 'date_needed' действительно датой сохранения поля varchar в формате' yyyy-MM'? – V4Vendetta

+0

@RajeevKumar, я хочу сравнить текущее время в таблице базы данных mySQL 'tblOrder' и с столбцом' date_needed', поэтому у меня есть этот запрос 'string query = 'SELECT * FROM tblOrder WHERE date_needed = @ dateTimeNow"; ' – Harvey

ответ

5

Вы должны предоставить полную дату (как в 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"; 

Или - возможно, более performantly - вы могли бы дать начальную и конечную точки:

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

Спасибо, что он работает сейчас. :) – Harvey

0

Если вы хотите получить количество строк в SQL использовании

Но нужно пройти полное значение даты в @dateTimeNow

SELECT Count(*) FROM tblOrder WHERE MONTH(date_column)= MONTH(@dateTimeNow) and YEAR(date_column) = YEAR(@dateTimeNow) 
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') 
Смежные вопросы