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

时间:2013-08-04 08:50:23

标签: c# mysql datetime-format

我想在两个日期之间获取数据。我正在使用MySql数据库和我的C#winforms。在插入日期时,我将日期转换为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);

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

5 个答案:

答案 0 :(得分:2)

  

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

类型的列

没有冒犯,但这是非常错误的。没有理由使用varchar作为日期值的列类型。请改用DATEDATETIME列类型。这就是他们的目的。

在您的情况下,我建议您使用DATE列类型,因为它支持YYYY-MM-DD格式。

您应始终使用 parameterized queries 。这种字符串操作对 SQL Injection 攻击是开放的。

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

答案 1 :(得分:1)

您无法在varchar列之间进行操作,您必须先将其强制转换为日期时间/日期。

如下所示:

cast(trans_date as date) BETWEEN '"+dateFrom+"' AND  '"+dateTo+"'

虽然没有理由将日期值保存到varchar列中,但您应该修改表并使用正确的columntype,这样就不需要进行强制转换。

不过,你应该使用参数而不是字符串操作。

答案 2 :(得分:0)

您可能正在寻找 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);

答案 3 :(得分:0)

您无法将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();
}

答案 4 :(得分:0)

试试这个,但我使用 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。但它的工作正常。