从C#中的MySql获取两个日期之间的数据
本文关键字:两个 日期 之间 数据 中的 MySql 获取 | 更新日期: 2023-09-27 18:26:11
我想获取两个日期之间的数据。我的C#winforms使用的是MySql数据库。在插入日期时,我将日期转换为dd-MM-yyyy
,并将这些日期保存在varchar类型的数据库中。现在我想在两个日期之间获取结果,这是我的代码:
string dateFrom = dtp_dfrom.Value.ToString("dd-MM-yyyy");
string dateTo = dtp_dto.Value.ToString("dd-MM-yyyy");
//MessageBox.Show(dateFrom+" "+dateTo);
conn = new MySqlConnection(myconstring);
DataTable dt = new DataTable();
MySqlDataAdapter sda = new MySqlDataAdapter("SELECT trans_date, product_type AS Item, product_quantity, amount, SUM( product_quantity ) AS Qty, SUM( amount ) AS 'Total Price' FROM main_table WHERE trans_date BETWEEN '"+dateFrom+"' AND '"+dateTo+"' GROUP BY product_type", conn);
sda.Fill(dt);
现在的问题是我没有按要求得到日期。任何人都可以帮我。我对日期格式很陌生。提前谢谢。
我将日期转换为dd-MM-yyyy,并将这些日期保存在具有varchar类型列的数据库
无意冒犯,但这大错特错。没有理由将varchar
用作日期值的列类型。请改用DATE
或DATETIME
列类型。这就是他们的目的。
- MySQL数据类型
在您的情况下,我建议您使用DATE
列类型,因为它支持YYYY-MM-DD
格式。
您应该始终使用参数化查询。这种字符串操作对SQL注入攻击是开放的。
string dateFrom = dtp_dfrom.Value.ToString("yyyy-MM-dd");
string dateTo = dtp_dto.Value.ToString("yyyy-MM-dd");
using(MySqlConnection conn = new MySqlConnection(myconstring))
{
DataTable dt = new DataTable();
using(MySqlCommand cmd = new MySqlCommand("SELECT trans_date, product_type AS Item, product_quantity, amount, SUM( product_quantity ) AS Qty, SUM( amount ) AS 'Total Price' FROM main_table WHERE trans_date BETWEEN @dateFrom AND @dateTo GROUP BY product_type"))
{
cmd.Parameters.AddWithValue("@dateFrom", dateFrom);
cmd.Parameters.AddWithValue("@dateTo", dateTo);
MySqlDataAdapter sda = new MySqlDataAdapter(cmd, conn);
sda.Fill(dt);
}
}
不能在varchar列上执行between,必须先将其强制转换为datetime/date。
如下所示:
cast(trans_date as date) BETWEEN '"+dateFrom+"' AND '"+dateTo+"'
虽然没有理由将日期值保存到varchar列中,但应该修改表并使用正确的列类型,这样就不需要强制转换。
顺便说一句,应该使用参数而不是字符串操作。
您可能正在寻找STR_TO_DATE
string dateFrom = dtp_dfrom.Value.ToString("yyyy-MM-dd HH:mm:ss");
string dateTo = dtp_dto.Value.ToString("yyyy-MM-dd HH:mm:ss");
MySqlDataAdapter sda = new MySqlDataAdapter("SELECT trans_date, product_type AS Item, product_quantity, amount, SUM( product_quantity ) AS Qty, SUM( amount ) AS 'Total Price' FROM main_table WHERE STR_TO_DATE(trans_date,''%d-%m-%Y'') BETWEEN '"+dateFrom+"' AND '"+dateTo+"' GROUP BY product_type", conn);
不能将BETWEEN
与varchar
数据一起使用,必须使用datetime/date
作为列类型。
最好在查询中使用参数,如下所示:
DataTable dt = new DataTable();
MySqlCommand cmd = new MySqlCommand("SELECT trans_date, product_type AS Item, product_quantity, amount, SUM( product_quantity ) AS Qty, SUM( amount ) AS 'Total Price' FROM main_table WHERE trans_date BETWEEN @from AND @to GROUP BY product_type", conn);
try
{
SqlParameter param;
param = new MySqlParameter("@from", MySqlDbType.DateTime);
param.Value = dateFrom ;
cmd.Parameters.Add(param);
param = new MySqlParameter("@to", MySqlDbType.DateTime);
param.Value = dateTo;
cmd.Parameters.Add(param);
MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
sda.Fill(dt);
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
}
试试这个,但我使用DateTime作为数据类型存储日期。
SqlConnection con = new SqlConnection("Data Source=xxx''SQLEXPRESS;Initial Catalog=abc;Integrated Security=true;");
con.Open();
SqlCommand cmd = new SqlCommand("select p.POID,p.SupplierID,p.SupplierDesc, p.CreateDate, p.PaymentDetails,p.Status,q.Quantity,q.BalQty,q.PartNo from PoToSupplierMaster p inner join PoToSupplierMasterItems q on p.POID=q.SNO where q.PartNo='" + DropDownList3.SelectedItem.Text + "' and p.CreateDate between '" + TextBox1.Text + "' and '" + TextBox2.Text + "'", con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
GridView2.DataSource = ds;
GridView2.DataBind();
就我而言,我使用了gridview。但它运行良好。