我有一个简单的搜索页面,它从Sybase数据库中搜索Contract-Site-inspection。 它有3个表单字段变量: -
<form name="inspections" action="" method ="post">
<!---a list of Sites where the Inspections occured --->
<select name="selectSitesList" id="selectSitesList" multiple >
<option value=""></option>
</select>
<input name="startDate" id="startDate" value="">
<input name="endDate" id="endDate" value="">
</form>
当在搜索框中给出startDate时,查询不会选择任何结果。(例如:-01/01/2001)。但是当搜索框中没有提供startDate时(即StartDate为NULL或为空),显示所有可能的结果。 Sybase Select查询如下: -
SELECT ins.Inspection_ID
, ins.SiteLoc_ID
, sl.SiteLoc_Name
, ins.Inspected_By
, ins.Inspection_Reason
, ins.Inspection_Comments
, ins.Inspection_Date
From INSPECTIONS ins
, SITELOCATION sl
Where ins.SiteLoc_ID = sl.SiteLoc_ID
<cfif IsDefined ("form.selectSitesList") AND rtrim(ltrim(form.selectSitesList)) NEQ "">
And ins.SiteLoc_ID in (#listqualify(form.selectSitesList,"'")#)
</cfif>
<cfif (IsDefined ("form.startDate") AND rtrim(ltrim(form.startDate)) NEQ "") and (IsDefined ("form.endDate") AND rtrim(ltrim(form.endDate)) NEQ "") >
And CONVERT(VARCHAR(8), ins.Inspection_Date, 112) Between '#DateFormat(form.startDate, 'yyymmdd')#' and '#DateFormat(form.endDate, 'yyymmdd')#'
<cfelseif IsDefined ("form.startDate") AND rtrim(ltrim(form.startDate)) NEQ "">
And CONVERT(VARCHAR(8), ins.Inspection_Date, 112) = '#DateFormat(form.startDate, 'yyymmdd')#'
</cfif>
Order By sl.SiteLoc_Name
, ins.Inspection_Date
我想知道#DateFormat(form.startDate,'yymmdd')#{2 y's}是否正确而不是#DateFormat(form.startDate,'yyymmdd')#{3 y's} 使用CF-8。 请帮助。
答案 0 :(得分:3)
CONVERT(VARCHAR(8),ins.Inspection_Date,112)构造的值是否可以产生一些可以明显地与'#DateFormat(form.startDate,'yyymmdd')#'的值进行比较的值? “yyy”看起来像是一个奇怪的年份面具(与更常见的“yyyy”或“yy”相比,我的意思是)。
对我来说,将数据库中的日期列转换为字符串并将表单字段转换为字符串sto比较它们,而不是将表单字段转换为日期并将其进行比较,这似乎很奇怪。
此外,无论基础情况如何,您都应该使用CFQUERYPARAM来参数化您的动态值,而不是将您的SQL字符串硬编码。
答案 1 :(得分:1)
您是否尝试过#DateFormat(form.startDate,'yyyymmdd')#?
答案 2 :(得分:1)
如果必须使用字符串,则格式必须与Adam所说的匹配。但是,我还建议使用datetime对象。使用convert
函数时,可能会阻止数据库正确使用索引。 (更不用说依赖隐式转换时总会出现意外结果。虽然yyyymmdd
格式不太可能)
我通常使用下面的查询进行日期范围比较。它检索特定日期范围内的所有记录,而不必担心时间部分。请注意,Sybase的sql类型可能略有不同。
<cfset form.startDate = "01/01/2001">
<cfset form.endDate = "01/31/2001">
...
<!--- cf_sql_date ensures any time portion is truncated --->
AND ins.Inspection_Date >= <cfqueryparam value="#form.startDate#" cfsqltype="cf_sql_date">
AND ins.Inspection_Date < <cfqueryparam value="#dateAdd('d', 1, form.endDate)#" cfsqltype="cf_sql_date">
..结果相当于您的BETWEEN
声明,即在2001年1月1日至31日期间查找日期的所有记录
...
AND ins.Inspection_Date >= January 1, 2001 12:00 AM
AND ins.Inspection_Date < February 1, 2001 12:00 AM