比较数据库中存储为varchar的日期后显示记录

时间:2018-07-02 14:20:40

标签: c# sql .net sql-server

我将日期存储为dd/mm/yy,我想显示基于日期的记录。我已经编写了以下代码,但未返回正确的结果。我认为查询中存在一些错误。

private void FillDataGrid()
{
    con.Open();

    var date1 = Convert.ToDateTime(datePicker1.SelectedDate.Value).ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
    var date2 = Convert.ToDateTime(datePicker2.SelectedDate.Value).ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);

    label4.Content = date1;
    label5.Content = date2;

    SqlDataAdapter sda = new SqlDataAdapter("Select batch_id, product_name, quantity, left_qty, purchaseDate, manufacturing_date, expiryDate from batch where Convert(varchar, expiryDate, 103) BETWEEN '" + date1 + "' AND '" + date2 + "' ", con);
    DataSet ds = new DataSet();
    DataTable dt = new DataTable();   // being used to calculate total price
    sda.Fill(dt);
    sda.Fill(ds);

    if (ds.Tables[0].Rows.Count > 0)
    {
        // Binding the Grid with the Itemsource property
        dataGrid1.ItemsSource = ds.Tables[0].DefaultView;
    }

    con.Close();
}

附加了错误的结果快照Image of Wrong Results

3 个答案:

答案 0 :(得分:2)

上一行:

SqlDataAdapter sda = new SqlDataAdapter("Select batch_id,product_name,quantity,left_qty,purchaseDate,manufacturing_date,expiryDate from batch where Convert(varchar,expiryDate,103) BETWEEN '" + date1 + "' AND '" + date2 + "' ", con);

...并将其转换为类似这样的内容:

SqlDataAdapter sda = new SqlDataAdapter("Select batch_id,product_name,quantity,left_qty,purchaseDate,manufacturing_date,expiryDate from batch where Convert(varchar,expiryDate,103) BETWEEN @from AND @to;", con);
sda.SelectCommand.Parameters.AddWthValue("@from", "'" + Convert.ToDateTime(datePicker1.SelectedDate.Value).ToString("yyyyMMdd") + "'");
sda.SelectCommand.Parameters.AddWthValue("@to", "'" + Convert.ToDateTime(datePicker2.SelectedDate.Value).ToString("yyyyMMdd") + "'");

所以我很快用Visual Studio 2017解决方案在SQL Sever 2016数据库中进行了欺骗。我必须删除单引号才能使其正常工作,但我可能对此有些怀疑。这是我实际上最终开始工作的代码:

SqlDataAdapter sda = new SqlDataAdapter("Select batch_id, product_name, quantity, left_qty, purchaseDate, manufacturing_date, expiryDate from batch where CONVERT(DATE, expiryDate, 103) BETWEEN @from AND @to;", con);
sda.SelectCommand.Parameters.AddWithValue("@from", Convert.ToDateTime(datePicker1.Value).ToString("yyyyMMdd"));
sda.SelectCommand.Parameters.AddWithValue("@to", Convert.ToDateTime(datePicker2.Value).ToString("yyyyMMdd"));

请注意,我的日期时间选择器无法与SelectedDate一起使用,但是您很可能会针对其他版本的.NET等,因此也许您将需要这些。无论如何,这里的关键是:

  • CONVERT使用DATE将文本字符串转换为103,以使其处理dd / mm / yyyy格式;
  • 参数化您的fromto日期,以避免SQL注入等;
  • 请勿添加单引号',因为当您使用参数时,这一切对您来说都很好。

不过,我同意以上其他评论者的意见;将日期作为文本存储在数据库中是一场灾难,等待发生。这应该会让您有短期的选择,但是我建议您退后一步,在较长期的情况下考虑一下。


最后,这是工作原理的图片,以及背后的代码:

SQLDataAdapterCode

答案 1 :(得分:0)

我已经在@Richard Hansel的帮助下解决了它。现在下面是代码的工作行。

storage

答案 2 :(得分:-1)

尝试在查询中使用如下分隔符(#)。

SqlDataAdapter sda = new SqlDataAdapter("Select batch_id,product_name,quantity,left_qty,purchaseDate,manufacturing_date,expiryDate from batch where Convert(varchar,expiryDate,103) BETWEEN #" + date1 + "# AND #" + date2 + "# ", con);