C# 按日期搜索数据库的Sql查询
有人可以建议我用sql查询来搜索ms数据库中的特定日期吗 例如,我想搜索2013年2月13日的所有交易。 在我的数据库中,我有一个名为“购买日期”的列,它存储购买日期 在数据库中,日期以以下格式存储:16/02/2013 02:47:36 AM 我希望tom在文本框中输入我想要的日期,然后将该值传递给查询C# 按日期搜索数据库的Sql查询,c#,sql,datetime,C#,Sql,Datetime,有人可以建议我用sql查询来搜索ms数据库中的特定日期吗 例如,我想搜索2013年2月13日的所有交易。 在我的数据库中,我有一个名为“购买日期”的列,它存储购买日期 在数据库中,日期以以下格式存储:16/02/2013 02:47:36 AM 我希望tom在文本框中输入我想要的日期,然后将该值传递给查询 public DataSet OrderByDate(DateTime date) { // string connString = "Provid
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;
}
公共数据集OrderByDate(日期时间日期)
{
//string connString=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=C:\\Users\\Amrit\\Desktop\\Database.accdb;持久安全信息=False;”;
数据集=新数据集();
OLEDB连接oleConn=新的OLEDB连接(connString);
尝试
{
尺骨鹰嘴开();
string sql=“选择客户。[Title]+空格(2)+客户。[客户姓名]作为客户名,客户。[客户的Ebayname],客户。[电子邮件地址],客户。[电话号码],客户。[地址1]+空格(2)+客户。[地址2]+空格(2)+客户。[城市]+空格(2)+客户。[邮政编码]+空格(2)+客户。[国家]as地址,客户[采购的物品]、客户[采购的日期]、客户[总价]来自客户,其中[采购的日期]=“+”日期;
OleDbDataAdapter dataAdapter=新的OleDbDataAdapter(sql,OLECTONN);
dataAdapter.Fill(数据集,“客户”);
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
最后
{
鹰嘴闭合();
}
如果(dataSet.Tables.Count,则可以使用it运算符进行查询
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
date-like
- 2013年2月13日凌晨02:47:36
- 2013年2月13日14:24:02上午
并始终在查询中使用。此类代码始终为.Like;打开。如果要从where子句中删除时间成分,请执行以下操作:
where YourDateField >= @StartDate
and YourDateField < @TheDayAfterTheEndDate
其中YourDateField>=@StartDate
和您的日期字段<@结束日期后的第二天
根据问题中的数据,@StartDate为2013-02-13,@thedayaftheenddate为2013-02-14。理想情况下,避免任何形式的“时间”在插入/更新数据库和读取数据库时,我总是使用日期时间的
Date
属性。事实上,我在时间不重要的列上编写了一些包装器代码来自动执行此操作
这确保在数据库中,插入和更新时时间始终为00:00:00
因此查询(避免任何其他SQL注入/参数化查询问题)
一切都是平等的,并且知道所有插入也使用了
.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);
}
DateTime start=DateTime.Now.Date;//这将为您提供2013年2月16日12:00:00am
DateTime end=start.AddDays(1);//这将使您在2013年2月17日12:00:00am
//确保像这样参数化您的查询
string sql=“从产品中选择*,其中PurchasedDate>=@start和PurchasedDate<@end”;
System.Data.SqlClient.SqlConnection conn=new System.Data.SqlClient.SqlConnection();
使用(康涅狄格州)
{
System.Data.SqlClient.SqlCommand=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);
命令.Parameters.Add(pmStart);
命令.Parameters.Add(pmEnd);
}
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;
}
date.date仅返回日期部分(时间为00:00:00)和date.date.AddDays(1)是下一个日期(时间也为00:00:00)例如,2012-02-16 00:00:00和2012-02-17 00:00:00-准确地说是24小时-一天。如果您愿意,您可以减去一个勾号,但想法仍然是一样的。这样,我们将选择日期在该范围内的所有记录(因此使用“介于之间”)。您可以尝试使用Oracle datetime函数实现相同的功能,但我认为这是更短/更清晰的功能。根据MSDN库,您可以使用将datetime对象转换为以明确方式格式化的字符串:
string datestring = date.ToString("yyyyMMdd");
string sql =
" SELECT ... "
+ " FROM Customer "
+ " WHERE [Purchased Date] >= '" + datestring + "'"
+ " AND [Purchased Date] < DATEADD(day, 1, '" + datestring + "')" ;
string datestring=date.ToString(“yyyyymmdd”);
字符串sql=
“选择…”
+“来自客户”
+“其中[购买日期]>=”“+datestring+””
+“和[购买日期]
我很确定有更好的方法将参数传递给查询字符串,而不是像这样使用引号。例如,请参见以下问题:我是否必须通过转换为odatetime、Convert.ToDateTime(textbox1.text)从文本框传递输入@实际上,对于搜索来说,Ypercury不能进行比较。在这种情况下,它看起来是一个很好的解决方案。为什么你认为这可能是一个坏主意?将日期作为字符串传递并使用like不会给出任何结果//@AmritSharma我不确定(因为我现在无法尝试)但是如果你把
13/02/2013
作为输入,这应该适用于这种情况。+1用于参数化查询建议。但是不要使用LIKE-这不是最佳选择。[Purchased Date]
列的数据类型是什么?让你的C代码生成这个条件其中[Purchased Date]>='20130213'和[Purchased Date]
。传递到时,日期应为'YYYYMMDD'
格式
new OleDbParameter("dateStart", date.Date),
new OleDbParameter("dateEnd", date.Date.AddDays(1).AddTicks(-1))
string datestring = date.ToString("yyyyMMdd");
string sql =
" SELECT ... "
+ " FROM Customer "
+ " WHERE [Purchased Date] >= '" + datestring + "'"
+ " AND [Purchased Date] < DATEADD(day, 1, '" + datestring + "')" ;