SQL where 子句中的转换错误

Conversion error in SQL where clause

在 ODBC 数据库中 table 我有一个名为 pSDateTime 的列,它具有 smalldatetime 格式。

我正在 运行 在基于 PHP 的网站上设置一个搜索表单,该网站有一个下拉列表,您可以在其中 select 2015、2014、2013 等

提交搜索时出现此错误:

Warning: odbc_exec(): SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting the varchar value '%2014%' to data type int., SQL state 22005 in SQLExecDirect

这是我的查询 运行:

$query = "SELECT *
            FROM tbspeakers s join tbpresentations p on
            s.spkrId = p.spkrId

            join tbsessions ss on
            p.courseSessionid = ss.courseSessionId

            join tbcourses c on
            ss.courseId = c.courseId

            WHERE 
            (fname LIKE '%$searchq%' OR lname LIKE '%$searchq%' OR pTitle LIKE '%$searchq%' AND Year(pSDateTime) = '%$yearq%')

            ORDER BY pSDateTime DESC";

我尝试了不同类型的转换,但总是出现同样的错误。当我 运行 Microsoft SQL Server Management Studio 上的查询时,它工作正常。我似乎无法计算出“%$yearq%”format/conversion。

YEAR() returns 一个整数。这会导致相等性问题,因为另一个参数随后被转换。而且,这会产生错误。

两个选择:

Year(pSDateTime) = $yearq

或:

datename(year, psDateTime) = '$yearq'

您可能不想要 = 的通配符 %。这些仅适用于 LIKE.

您还应该了解如何参数化进入查询的值。这使它更安全(防止 SQL 注入)并且通常更快(通过消除每次执行代码时的重新编译)。