有人能用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;
}
- 始终尝试使用原始/正确的数据类型进行查询。在这种情况下-日期时间
- 永远不要将参数连接到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压缩插入语句