ColdFusion日期前的日期

问题描述:

我似乎在这里有一个大脑放屁。我试图在今天的日期之前显示在数据库中输入了14天或更多的所有用户。出于某种原因,我要么获得每个人或没有人,但不是我需要的人。这是我的。请告诉我我哪里错了。谢谢!ColdFusion日期前的日期

<CFSET TodaysDate = #DateFormat (Now(), "mm-dd-yyyy")#> 
<CFSET CheckDate = #DateFormat(TodaysDate-14,"mm-dd-yyyy")#> 

<cfquery name="getUser" datasource="DNS_Test"> 
    select * 
    from Login 
    where DateEntered <= #CheckDate# 
</cfquery> 


<cfoutput> 
<cfloop QUERY="getUser"> 
    #getUser.LastName#, #getUser.FirstName# <br> 
<cfloop> 
</cfoutput> 
+0

日期格式返回一个字符串,而不是一个约会对象。将您的1st cfset更改为CreateDate(year(now()),month(now()),day(now()))。然后阅读克里斯的答案。 – 2014-12-01 23:52:22

+0

这是因为你正在传递一个与你想象的完全不同的价值。 '#CheckDate#'实际上会计算一个数字:'-2020'。即月份数 - 日 - 年,即'11-17-2014 == -2020'。查询不会引发错误的原因是日期/时间列在内部表示为数字。所以你目前的查询实际上是比较两个数字。但是,它显然不是使用你所想的日期(即数字)......为了避免这些问题,你应该使用日期对象和'cfqueryparam',正如Chris所建议的那样。 – Leigh 2014-12-02 00:00:01

+1

* Dateformat返回一个字符串*是的,但由于缺少引号,它实际上被转换为数字。所以他们正在执行的实际查询是:'..其中DateEntered Leigh 2014-12-02 00:08:50

你会想要使用DateAdd()

示例:从不use select *,而使用列名......还用<cfqueryparam>

SELECT LastName, FirstName 
FROM Login 
WHERE DateEntered <= <cfqueryparam value="#DateAdd('d', -14, now())#" CFSQLType="CF_SQL_DATE"> 
+4

我希望我可以+1再次告诉OP不要使用'select *' – 2014-12-01 23:22:36

+3

*调查使用cfqueryparam * +1。当然。上面的例子是处理查询日期的正确方法。即使用日期对象,而不是字符串。另外,使用cfquerparam,并输入正确的类型,例如“cf_sql_date”或“cf_sql_timestamp”。 – Leigh 2014-12-02 00:27:44

+1

尼斯查询参数克里斯。 +1 – 2014-12-02 21:28:31

你也可以做在SQL计算调查。例如,在SQL Server:如果DateEntered有HH

SELECT LastName, FirstName 
FROM Login 
WHERE DateEntered <= CONVERT(date, 
    DateAdd(dd, <cfqueryparam value="-14" CFSQLType="CF_SQL_INTEGER">, 
    getDate()) 
    ) 

可能需要做一些调整:MM:SS

+1

我很惊讶,目前有负面评价2。从技术上讲,我认为它不回答* ColdFusion *问题,但它肯定是一个有效的建议,我也会这样做。不是说我会用它来代替,但我至少会提到它。 – 2014-12-02 11:24:17

+0

我没有downvote它,但这个答案有一个小问题。 GetDate()返回可能证明有问题的日期和时间。如果我打算使用这种方法,我会将getDate()转换为日期。 – 2014-12-02 13:41:54

+2

对不起,但-1。不要在列上使用函数。它会阻止数据库使用索引。此外,不需要将列值转换为日期。只需将*常量*转换为所需的值,比较运算符就可以完成剩下的工作。 – Leigh 2014-12-02 18:42:19