Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按日期搜索数据库的Sql查询_C#_Sql_Datetime - Fatal编程技术网

C# 按日期搜索数据库的Sql查询

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

有人可以建议我用sql查询来搜索ms数据库中的特定日期吗

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

在数据库中,日期以以下格式存储:16/02/2013 02:47:36 AM

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

 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);
}
  • 始终尝试使用原始/正确的数据类型进行查询。在本例中为-datetime
  • 永远不要将参数连接到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;
        }
    

    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 + "')" ;