Sql查询,用于按日期搜索数据库



有人能用sql查询建议我搜索具有特定日期的ms数据库吗。

例如,我想搜索2013年2月13日的所有交易。在我的数据库中,我有一个名为"购买日期"的列,它存储购买日期。

在数据库中,日期以这种格式存储2013年2月16日凌晨02:47:36。

我想在文本框中输入我想要的日期,然后将该值传递给查询。

 public DataSet OrderByDate(DateTime 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]='" + 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;
        }
  1. 始终尝试使用原始/正确的数据类型进行查询。在这种情况下-日期时间
  2. 永远不要将参数连接到SQL中,尤其是字符串,尤其是当字符串是用户输入时

以下内容应该有效:

    public DataSet OrderByDate(DateTime date)
    {
        string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amrit\Desktop\Database.accdb ;Persist Security Info=False;";
        var dataSet = new DataSet();
        using(var oleConn = new OleDbConnection(connString))
        {
            try
            {
                oleConn.Open();
                var cmd = oleConn.CreateCommand();
                cmd.CommandText = "SELECT * FROM Customer WHERE [Purchased Date] BETWEEN :dateStart AND :dateEnd";
                cmd.Parameters.AddRange(new[]
                    {
                        new OleDbParameter("dateStart", date.Date),
                        new OleDbParameter("dateEnd", date.Date.AddDays(1).AddTicks(-1))
                    }
                    );
                var dataAdapter = new OleDbDataAdapter(cmd);
                dataAdapter.Fill(dataSet, "Customer");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        return dataSet.Tables.Count <= 0 ? null : dataSet;
    }

为了清楚起见,我删除了那一长串专栏。据我所知,Oracle希望参数名称前面有冒号(:),而不是SQL Server的"@"。如果以上不起作用,请尝试使用@,或者只使用?而不是参数名称,并提供不带名称的参数。

即使抛出异常,"using"部分也应该很好地处理关闭连接的问题,并且看起来比代码中的finally部分更整洁。

关于此部分:

                    new OleDbParameter("dateStart", date.Date),
                    new OleDbParameter("dateEnd", date.Date.AddDays(1).AddTicks(-1))

date。date只返回日期部分(时间为00:00:00)和日期。Date.AddDays(1)是下一个日期(时间也是00:00:00),例如2012-02-16 00:00:00和2012-02-17 00:00:00——正好是24小时——一天。如果你愿意,你可以减去一个勾号,但这个想法仍然是一样的。通过这种方式,我们选择日期在该范围内的所有记录(因此使用BETWEEN)。您可以尝试使用Oracle日期时间函数来实现同样的效果,但我相信这会更短/更干净。

您可以在查询中使用它LIKE运算符;

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 "%'";

它得到的结果是所有字符串都包含13/02/2013日期类似;

  • 2013年2月13日凌晨02:47:36
  • 2013年2月13日上午14:24:02

等等。。

在查询中始终使用parameterized sql。这类代码对于SQL Injection始终是开放的。喜欢

当您想从where子句中删除时间组件时,可以执行以下操作:

where YourDateField >= @StartDate
and YourDateField < @TheDayAfterTheEndDate

使用问题中的数据,@StartDate将为2013-02-13,@TheDayAfterTheEndDate将为201302-14。

理想情况下,为了避免任何类型的"时间"问题,无论是在插入/更新数据库时还是在读取数据库时,我都会使用日期时间的Date属性。事实上,我编写了一些包装器代码,以便在时间不重要的列上自动执行此操作。

这确保了在数据库中,插入和更新时的时间始终为00:00:00

因此查询(避免任何其他SQL注入/参数化查询问题)

"SELECT * FROM _table WHERE _date = '" + date.Date + "'";

在所有条件相同的情况下,知道所有插入都使用了.Date,我们就可以不再担心时间了。

不要使用like,你可以使用一个普通的WHERE子句:

        DateTime start = DateTime.Now.Date; //this will get you 2/16/2013 12:00:00am
        DateTime end = start.AddDays(1); //this will get you 2/17/2013 12:00:00am
        //make sure to parameterize your query like this
        string sql = "SELECT * FROM Product WHERE PurchasedDate >= @start AND PurchasedDAte < @end";
        System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection();
        using (conn)
        {
            System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, conn);
            System.Data.SqlClient.SqlParameter pmStart = new System.Data.SqlClient.SqlParameter("start", start);
            System.Data.SqlClient.SqlParameter pmEnd = new System.Data.SqlClient.SqlParameter("end", end);
            command.Parameters.Add(pmStart);
            command.Parameters.Add(pmEnd);
        }

根据MSDN库,您可以使用DateTime.ToString方法(字符串)将DateTime对象转换为以明确方式格式化的字符串:

string datestring = date.ToString("yyyyMMdd"); 
string sql = 
  " SELECT ... "
+ " FROM Customer "
+ " WHERE [Purchased Date] >= '" + datestring + "'" 
  + " AND [Purchased Date] < DATEADD(day, 1, '" + datestring + "')" ;

我确信有比这样使用引号更好的方法将参数传递给查询字符串。请参阅以下问题的示例:如何正确清理(或参数化)SQL压缩插入语句

相关内容

  • 没有找到相关文章

最新更新