【问题标题】:Why is this C# date comparison with SQL datetime not returning results?为什么这个 C# 日期与 SQL 日期时间比较不返回结果?
【发布时间】:2015-03-23 17:39:28
【问题描述】:

我知道SQL中这个日期范围之间存在记录,但我尝试了各种格式,甚至将范围扩大了很多,但仍然没有返回结果。我在这个查询中做错了什么导致没有记录被返回?感谢您的帮助。

DateTime today = DateTime.Now;
DateTime tomorrow = today.AddDays(1);
DateTime yesterday = today.AddDays(-1);

DateTime dt = DateTime.Now;
string yesterdayString = yesterday.ToString("yyyy-MM-dd HH:mm:ss");
string tomorrowString = tomorrow.ToString("yyyy-MM-dd HH:mm:ss");

int itemNum = 0;
string query = "select DocID, CNo, DocType, DocNumber from errordata where cno = '" + cno + "' and createddate > '" + yesterdayString + "' and createddate < '" + tomorrowString + "' order by '" + sorton + "'desc";

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入
  • 因为您应该在查询中使用参数
  • 也许您没有得到结果,因为您也在过滤“CNO”并且该陈述不正确?
  • 你不是因为无效的 sql 而得到异常吗?
  • 很抱歉,我删除了一些代码,包括正在选择的几行。我不小心删除了 from 部分,但是,查询本身仍然包含 from 。我已经尝试添加参数,但它仍然没有返回任何记录。我在 SQL 中测试了相同的查询并且它有效,这只是我假设的 C# 日期的问题。

标签: c# sql datetime


【解决方案1】:

您正在创建的查询缺少 FROM 子句。我希望你得到一个例外。

【讨论】:

  • 回答实际问题的唯一答案(不是关于参数的部分不重要)
  • 不太可能。如果日期格式不正确,则不会得到结果,如果 from 子句丢失,则预期结果是异常。尽管如此,还是没有看到 from 子句的好消息。
  • 是的,除了 FROM 子句之外,这是有效的 T-SQL。我不知道发帖人做了多少工作才能将他的问题归结为易于消化的东西。
  • 嗯,使用参数是一种“最佳实践”等,它不会使他的查询无效
  • 它确实确保你不会得到这个日期的结果,地球上谁知道如何在 sql server 理解的字符串中格式化日期。
【解决方案2】:

您可以尝试以下方法:

string query = "SELECT DocID, CNo, DocType, DocNumber "+
               "FROM tableName "+
               "WHERE cno = @cno AND "+
               "CreatedDate BETWEEN @yesterday AND @tomorrow";

var sqlCommand = new SqlCommand(query, connectionString);

sql.Parameters.Add("@cno", cno);
sql.Parameters.Add("@yesterday", yesterday);
sql.Parameters.Add("@tomorrow", tomorrow);

我认为您的问题是缺少FROM。此外,我使用参数编写了您的查询,这可以防止 sql 注入。

【讨论】:

    【解决方案3】:

    如果您使用参数化查询,您将不会遇到此问题。 见:http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06

    您的查询应如下所示:

    @"SELECT VALUE Contact FROM AdventureWorksEntities.Contacts 
                AS Contact WHERE Contact.LastName = @ln" ;
    

    注意参数的@占位符 那么你可以这样做:

    // 2. define parameters used in command object
    SqlParameter param  = new SqlParameter();
    param.ParameterName = "@City";
    param.Value         = inputCity;
    
    // 3. add new parameter to command object
    cmd.Parameters.Add(param);
    
    // get data stream
    reader = cmd.ExecuteReader();
    

    但参数值可以是普通的 DateTime 值,例如 DateTime.Today。 这应该让你开始。

    还要检查您可能遇到的异常。无效的 sql 会抛出异常。捕获它们并根据需要更正 sql。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 2020-06-05
      • 2011-02-13
      • 2016-09-19
      相关资源
      最近更新 更多