我想在两个日期之间获取数据。我正在使用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);
现在问题是我没有按要求得到日期。任何人都可以帮助我。我对日期格式很新。提前谢谢。
答案 0 :(得分:2)
我将日期转换为dd-MM-yyyy并将这些日期保存在 数据库具有 varchar
类型的列
没有冒犯,但这是非常错误的。没有理由使用varchar
作为日期值的列类型。请改用DATE
或DATETIME
列类型。这就是他们的目的。
在您的情况下,我建议您使用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)
您无法将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();
}
答案 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。但它的工作正常。