在ODBC数据库表中,我有一个名为pSDateTime的列,它具有smalldatetime格式。
我在一个基于PHP的网站上运行一个搜索表单,有一个下拉菜单,你可以选择2015年,2014年,2013年等
当我提交搜索时得到这个错误:
Warning: odbc_exec(): SQL error: [Microsoft][ODBC SQL Server . xmlDriver][SQL Server]转换varchar值时,转换失败'%2014%'到数据类型int。
查询SQL状态
这是我运行的查询:
$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%"的格式转换出来。
YEAR()
返回一个整数。这会导致等式的问题,因为另一个参数会被转换。这会产生一个错误。
两个选择:
Year(pSDateTime) = $yearq
或:
datename(year, psDateTime) = '$yearq'
您可能不希望对=
使用通配符%
。这些只适用于LIKE
。
您还应该弄清楚如何将查询中的值参数化。这使得它更安全(防止SQL注入)并且通常更快(通过消除每次执行代码时的重新编译)。