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

现在的问题是我没有按要求得到日期。任何人都可以帮我。我对日期格式很陌生。提前谢谢。

从C#中的MySql获取两个日期之间的数据

我将日期转换为dd-MM-yyyy,并将这些日期保存在具有varchar类型列的数据库

无意冒犯,但这大错特错。没有理由将varchar用作日期值的列类型。请改用DATEDATETIME列类型。这就是他们的目的。

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

不能将BETWEENvarchar数据一起使用,必须使用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。但它运行良好。