0

我想在两个日期之间获取数据。我正在使用 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);

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

4

5 回答 5

2

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

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

在您的情况下,我建议您使用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);
   }
}
于 2013-08-04T09:25:09.720 回答
1

您不能在 varchar 列上执行 between,您必须先将其转换为 datetime/date。

如下所示:

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

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

顺便说一句,您应该使用参数而不是字符串操作。

于 2013-08-04T08:57:50.333 回答
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);
于 2013-08-04T09:29:25.790 回答
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();
}
于 2013-08-04T09:32:37.423 回答
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。但它工作正常。

于 2013-08-04T09:33:48.260 回答