如何在SQL Server中比较日期

如何在SQL Server中比较日期,sql,sql-server,sql-server-2005,coldfusion,Sql,Sql Server,Sql Server 2005,Coldfusion,我有一个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_dat

我有一个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')#

谁能告诉我怎么做吗?

这里有几个问题。任何以_date结尾的表单字段都是表单验证条件。因此表单字段需要重命名为todate和fromdate。接下来,您可以尝试清理输入
cfqueryparam
用于执行此操作。最后但并非最不重要的一点是,您的查询应该看起来有点像:

<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>

选择*
来自用户\u激活\u事件
其中状态\ U代码=1
事件日期介于
和DATEADD(d,1,)
订购人。。。

这里有几个问题。任何以_date结尾的表单字段都是表单验证条件。因此表单字段需要重命名为todate和fromdate。接下来,您可以尝试清理输入
cfqueryparam
用于执行此操作。最后但并非最不重要的一点是,您的查询应该看起来有点像:

<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>

选择*
来自用户\u激活\u事件
其中状态\ U代码=1
事件日期介于
和DATEADD(d,1,)
订购人。。。

正如评论中所建议的,一种更灵活的过滤日期的方法是使用这种方法。无论列是只包含日期还是日期和时间,它都可以工作,并且不会干扰数据库对索引的使用(就像使用日期函数一样)

结果:

    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
值实际上存储为数字。该数字通常表示与某个或某个历元的偏移量。在CF/java中,它是自。因此,虽然您的IDE可能会向您显示一个人性化的日期字符串,如
yyy-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'}
其中Col>=1354510800000//java.util.Date=>{ts'2012-12-03 00:00:00'}
和Col{ts'2012-12-05 00:00:00}

正如评论中所建议的,一种更灵活的过滤日期的方法是使用这种方法。无论列是只包含日期还是日期和时间,它都可以工作,并且不会干扰数据库对索引的使用(就像使用日期函数一样)

结果:

    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
值实际上存储为数字。该数字通常表示与某个或某个历元的偏移量。在CF/java中,它是自。因此,虽然您的IDE可能会向您显示一个人性化的日期字符串,如
yyy-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'}
其中Col>=1354510800000//java.util.Date=>{ts'2012-12-03 00:00:00'}
和Col{ts'2012-12-05 00:00:00}

没有像#Dateformat这样的内置方法。您可以使用convert.search进行搜索it@polin呵呵?DateFormat存在@Russ显然存在DateFormat,但不存在查询中使用的#DateFormat。@在Coldfusion中,#符号用于插入动态值。这段特定的代码必须存在于cfquery块中,您可以在OP尝试时在其中插入动态值。他们认为我在用临时表做一些事情,没有像#Dateformat这样的内置方法。您可以使用convert.search进行搜索it@polin呵呵?DateFormat存在@Russ显然存在DateFormat,但不存在查询中使用的#DateFormat。@在Coldfusion中,#符号用于插入动态值。这段特定的代码必须存在于cfquery块中,您可以在OP尝试时在其中插入动态值。他们认为我在用临时表做一些事情。在将表单数据放到数据库之前,应该验证表单数据是否是日期,而不是仅仅依靠
来出错。Select*也应该启动。和dbo.user\u action\u事件。还有可能是一个带有(NOLOCK)Why
CONVERT(DATE,event_DATE)
?这将避免使用索引。我将使用>=开始日期和<结束日期之后的日期,而不是使用中间日期。使用between可能会返回太多记录。如果要在datetime字段上执行between搜索,则必须确保end变量中添加了23小时、59分钟和59秒,甚至更多,取决于数据库存储这些值的精确程度。在将表单数据放入数据库之前,可能应该验证表单数据是否为日期,而不是仅仅依靠
来出错。Select*也应该启动。和dbo.user\u action\u事件。可能还有一个(NOLOCK)Why
CONVERT(日期、事件)_
 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'}