我有一个HTML表单,我要求用户选择日期然后点击提交。提交后,我试图使用Coldfusion在所选日期之间获取记录。我的查询如下:
SELECT * FROM user_activation_events
where STATUS_CODE =1
AND event_date >= #Dateformat(form.from_date, 'dd-mm-yyyy')#
AND event_date <= #Dateformat(form.to_date, 'dd-mm-yyyy')#
但这不起作用,因为日期以这种格式存储在数据库中: yyyy-mm-dd hh:mm:ss
有人可以告诉我该怎么做吗?
答案 0 :(得分:3)
这里有几个问题。以_date结尾的任何表单字段都是表单验证标准。因此表单字段需要重命名为todate和fromdate。接下来,您正在尝试清理输入。 cfqueryparam
用于执行此操作。最后但并非最不重要的是,两者之间更清晰SQL您的查询应该看起来像:
<cfif isDate(form.fromDate) AND isDate(form.toDate)>
<cfquery name="qryUser_Activation_Events">
SELECT *
FROM user_activation_events
WHERE STATUS_CODE =1
AND event_date BETWEEN <cfqueryparam cfsqltype="CF_SQL_date" value="#form.fromDate#">
AND DATEADD(d, 1, <cfqueryparam cfsqltype="CF_SQL_date" value="#form.toDate#">)
ORDER BY ...
</cfquery>
<cfelse>
<!--- Error handling goes here --->
</cfif>
答案 1 :(得分:1)
正如评论中所建议的那样,使用这种方法可以更灵活地过滤日期。无论列是仅包含日期还是日期和时间,它都可以工作,并且不会干扰数据库对索引的使用(如使用日期函数)。
WHERE TheDateColumn >= TheStartDateAtMidnight
AND TheDateColumn < TheDayAfterEndDateAtMidnight
例如,如果您想在12/3和12/4/2012之间的任何时间返回所有日期的记录:
<!--- omitted date validation for brevity --->
<cfset form.from_date = "12/03/2012">
<cfset form.to_date = "12/04/2012">
<cfquery name="getEvents" datasource="#dsn#">
SELECT event_date
FROM user_activation_events
WHERE event_date >= <cfqueryparam value="#form.from_date#" cfsqltype="cf_sql_date">
AND event_date < <cfqueryparam value="#dateAdd('d', 1, form.to_date)#" cfsqltype="cf_sql_date">
AND status_code = 1
</cfquery>
示例数据
2012-12-02 23:59:59.000
2012-12-03 00:00:00.000
2012-12-03 07:34:18.000
2012-12-04 13:34:18.000
2012-12-04 23:59:59.000
2012-12-05 00:00:00.000
<强>结果:强>
1 | 2012-12-03 00:00:00.0
2 | 2012-12-03 07:34:18.0
3 | 2012-12-04 13:34:18.0
4 | 2012-12-04 23:59:59.0
但这不起作用,因为日期存储在数据库中 格式:yyyy-mm-dd hh:mm:ss
它与格式无关。日期时间值不会以您在屏幕上看到的方式存储。 yyyy-mm-dd hh:mm:ss
是一个用户友好的字符串,由您使用的任何IDE呈现,并且可以变化。通常,datetime
值实际上存储为数字。该数字通常表示某些base date或纪元的偏移量。在CF / java中,它是自unix epoch以来的毫秒数。因此,虽然您的IDE可能会显示一个人性化的日期字符串,如yyyy-mm-dd hh:mm:ss
,但在内部它只是一个数字。
将日期查询视为任何数字比较。如果查询没有返回您期望的所有记录,通常是因为您传入的其中一个数字太大或太小。
WHERE Col >= 1354510800000 // java.util.Date => {ts '2012-12-03 00:00:00'}
AND Col <= 1354683600000 // java.util.Date => {ts '2012-12-05 00:00:00'}