如何只获得日期的年和月部分进行比较
本文关键字:月部 比较 日期 | 更新日期: 2023-09-27 18:13:54
在我的应用程序中,我想计算具有相同的当前年份和月份的记录数量。因此,我的逻辑是将当前的年份和月份与表中的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());
}
}
}
我知道它不起作用,因为在我的消息框中它显示零而不是一条记录。你认为问题出在哪里?
你应该提供一个完整的日期(作为一个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);
如果你想在sql中获得行数,请使用
但是需要在@dateTimeNow中传递完整的日期值
SELECT Count(*) FROM tblOrder WHERE MONTH(date_column)= MONTH(@dateTimeNow) and YEAR(date_column) = YEAR(@dateTimeNow)
如果您想在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')