【问题标题】:Searching database with date使用日期搜索数据库
【发布时间】:2013-02-01 19:14:00
【问题描述】:

在我的 Windows 窗体中,我有一个文本框,用户可以在其中输入格式为 16/02/2013 的日期,以搜索该特定日期的所有条目。 在数据库中,我有一列以这种格式存储日期。16/02/2013 02:47:36 AM。

有人可以建议我使用 sql 查询从数据库中提取该特定日期的所有条目并将其放在数据集上。

我正在使用它,但它不起作用。

public DataSet OrderByDate(string date)
{
    //  string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Amrit\\Desktop\\Database.accdb ;Persist Security Info=False;";
    DataSet dataSet = new DataSet();
    OleDbConnection oleConn = new OleDbConnection(connString);

    try
    {
        oleConn.Open();
        string sql = "SELECT  Customer.[Title] + SPACE(2)  + Customer.[Customer's Name] as CustomerName, Customer.[Customer's Ebayname], Customer.[Email Address], Customer.[Phone Number], Customer.[Address 1] + SPACE(2)  +Customer.[Address 2] + SPACE(2)  + Customer.[City] + SPACE(2)  + Customer.[Post Code]+  SPACE(2)  + Customer.[Country] as Address, Customer.[Item Purchased], Customer.[Purchased Date], Customer.[Total Price] FROM Customer WHERE [Purchased Date] LIKE '" + "'" + date + "%'";
        OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, oleConn);
        dataAdapter.Fill(dataSet, "Customer");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    finally
    {
        oleConn.Close();
    }
    if (dataSet.Tables.Count <= 0)
        return null;
    else
        return dataSet;
}

在数据库中,日期时间以日期/时间格式存储。

【问题讨论】:

  • 在查询中使用绑定参数而不是 SQL 语句中的文字。这不是好的做法。此外,日期/时间不是字符串,因此“LIKE”在这里没有意义。应该是条件运算符( =、BETWEEN)等
  • 我知道,一旦我能让这个东西工作,我会改变它..
  • 您不能将LIKE 与日期一起使用。你想达到什么目的?
  • @AmritSharma,您使用的是哪个 RDBMS?
  • 查看 BETWEEN 运算符的日期,并给它一个从午夜到一天结束的范围。

标签: c# sql ms-access datetime


【解决方案1】:

在数据库方面,如果您的数据类型是日期,您可以这样做:

where yourdatefield = @dateIn

如果是日期时间,你可以这样做:

where yourdatefield >= @dateIn
and yourdatefield < the day after @dateIn

由于您使用的是 .net,因此您需要在应用程序代码中进行一些改进。首先,将日期字符串转换为 DateTime 对象。其次,将所有用户输入转换为参数。

【讨论】:

  • 你有时间帮我写查询吗,我不知道如何才能让这个东西工作,从昨天开始就卡住了
【解决方案2】:

你可能需要也可能不需要在 sql 中将日期时间用单引号括起来,我不记得了:

        DateTime start = DateTime.Parse("16/02/2013").Date;
        DateTime end = start.AddDays(1);
        string sql = "Select * From Customer WHere PurchasedDate >= {0} and PurchasedDate < {1}";
        sql = string.Format(sql, start, end);

另外,这是我在这里写的一种快速而肮脏的方法。它应该可以工作,但您真的应该将此查询参数化。

【讨论】:

    【解决方案3】:

    以这种方式传递日期值不起作用,因为您的 SQL 引擎无法识别 .NET 中的默认格式化日期和时间值。

    要将任何数据传递给您的查询,最好始终使用参数。为您的命令字符串添加一个参数:

    string sql = "SELECT * FROM Customer WHERE PurchaseDate = @pdate";
    
    OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);
    adapter.SelectCommand.Parameters.AddWithValue("pdate", date);
    adapter.Fill(dataSet, "Customer");
    

    命令文本中的@pdate 是一个参数。如示例所示,必须在执行命令之前提供参数的值。

    您还可以使用简单的字符串连接将值填充到 SQL 语句中,但这只能使用简单的整数或字符串值,并且通常不推荐,因为它会受到 SQL 注入攻击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多