如何在c#中编写SQL查询来查找DateTime

本文关键字:查询 SQL 查找 DateTime | 更新日期: 2023-09-27 17:59:58

因此,我在windows窗体中创建了一个搜索函数,允许用户根据在文本框中输入的内容搜索记录。我有工作代码,可以根据除DateTime之外的每个过滤器查找记录。例如:

if (customerID_rb.Checked == true)
                {
                    sqlQuery = "SELECT CustomerID, CustomerName, Telephone, DateAndTime, Status, Description from Calls WHERE CustomerID = " + item;
                    //'item' is the text in the textbox
                    UsingCommand(conn, table, sqlQuery);
                    return table;
                }
private static void UsingCommand(SqlConnection conn, DataTable table, string sqlQuery)
    {
        using (SqlCommand cmd = new SqlCommand(sqlQuery, conn))
        {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                da.Fill(table);
        }
    }

这将在CustomerID列中显示包含用户输入文本的记录。

然而,除了DateTime,我不太清楚如何做到这一点。我知道在SQL中,您可以键入'WHERE'DateTime=…'但无论我如何重新编写查询字符串,我都无法使其正常工作。

我得到的错误是:"SqlException未经处理:在"DateAndTime"附近的应为条件的上下文中指定的非布尔类型的表达式。"。

代码:

sqlQuery = "SELECT CustomerID, CustomerName, Telephone, DateAndTime, Status, Description from Calls WHERE DateTime DateAndTime  = '" + item +"'";

我已经尝试过使用和不使用DateTime以及多种不同的订单,如果有人能帮助我,我将不胜感激!

感谢

编辑:

好的。。。我有点搞砸了。我错误地认为你需要DateTime。然而,我可能会有这样的想法,因为如果我输入了错误的日期和时间,就会出现异常。谢谢!:)

如何在c#中编写SQL查询来查找DateTime

您应该永远不要将参数连接到SQL字符串中。

  • 它使您容易受到SQL注入攻击。

  • 它会产生性能问题,因为每个唯一的值都会创建一个新的SQL查询,该查询具有不同的哈希,这会破坏查询引擎的执行计划缓存机制。

  • 对于日期值,y/m/d、d/m/y或m/d/y字符串格式的顺序可能会有所不同,具体取决于当前区域性设置、操作系统全球化设置和数据库服务器的全球化设置。如果它们不是所有都同步,那么你可能会出现随机的奇怪情况,比如把1月3日误认为3月1日。

相反,您应该始终参数化您的查询查询获取值的占位符,然后使用单独的参数添加值。我不打算在这里给你举一个例子,因为你自己搜索这个需要很少的时间,而且在S.O.上已经有数百条关于这个的帖子了

您不需要指定数据类型DateTime,只需像一样使用列名编写查询即可

sqlQuery = "SELECT CustomerID, CustomerName, Telephone, DateAndTime, Status, Description from Calls WHERE columnname = '" + item +"'";

一般来说,最好添加sql参数,但采用字符串格式:

  " ...   WHERE DateAndTime = '" + item.ToString("yyyyMMdd") +"'"

yyyyMMdd应该在所有区域性中都可以安全使用。以上是假设,您必须搜索一个日期,不包括时间。大多数时间只在上搜索大于或小于。另外,如果日期字段本身包含时间,并且您只想搜索日期:

   "....   WHERE cast(DateAndTime as date)  = '" + item.ToString("yyyyMMdd") +"'"