2010-03-13 56 views
3

我想通过ColdFusion的传递一个MySQL查询以下日期:03/13/2010 所以查询过滤器针对它像这样:给定日期“03/13/2010”,在MYSQL Where子句中使用该日期?

SELECT * 
FROM myTable 
WHERE dateAdded before or on 03/13/2010 

我也希望能够采取2个日期为范围,从:2000年1月11日,于:03/13/2010

SELECT * 
FROMT myTable 
WHERE dateAdded is ON or Between 01/11/2000 through 03/13/2010 

此外,有没有办法有一个查询,可以处理两个都DATE_START和DATE_END,或者只是两个中的一个?

感谢

回答

0

您可以使用cfqueryparam和cfsqltype为CF_SQL_TIMESTAMP。 给出了“startDate”和“endDate”变量,下面的代码应该可以工作。如果任何的startDate或结束日期设定为像假的话,就不会被包含:

<cfset startDate = createDate(2010, 01, 19) /> 
<cfset endDate = createDate(2010, 01, 26) /> 

<cfquery name="q" datasource="#request.dsn#"> 
    SELECT * 
    FROM myTable 
    WHERE 
    (
     <cfif isDate(startDate)> 
      dateAdded >= <cfqueryparam value="#dateFormat(startDate, "YYYY/MM/DD")#" cfsqltype="CF_SQL_TIMESTAMP" /> 
     </cfif> 
     <cfif isDate(endDate)> 
      <cfif isDate(startDate)>AND</cfif> 
      dateAdded <= <cfqueryparam value="#dateFormat(endDate, "YYYY/MM/DD")#" cfsqltype="CF_SQL_TIMESTAMP" /> 
     </cfif> 
    ) 
</cfquery> 

尝试运行同样的事情,但无论是的startDate或结束日期设置为false,如下面来看看它是如何工作在一个单一的查询:

<cfset startDate = false /> 
<cfquery name="q" datasource="#request.dsn#">.... 
1
SELECT * 
FROM myTable 
WHERE dateAdded <= YourdateValue 

SELECT * 
FROM myTable 
WHERE dateAdded BETWEEN YourdateValueStart AND YourdateValueEnd 

看一看STR_TO_DATE(str,format)

这是 DATE_FORMAT()函数的反函数。它需要一个 字符串str和格式字符串格式。如果格式字符串包含两个 日期和时间部分,或日期或时间,如果字符串中包含唯一日期 或时间部分 值 STR_TO_DATE()返回一个DATETIME值 。如果从str中提取的日期时间值或日期时间值是 非法,STR_TO_DATE()返回NULL 并产生警告。服务器 扫描str以尝试将格式 与它匹配。格式字符串可以包含 文字字符和格式 以%开头的说明符。文字 格式中的字符必须与str中的 字面匹配。格式说明符 格式必须匹配str中的日期或时间部分 。对于格式中可以使用的说明符 ,请参阅DATE_FORMAT() 函数说明。

SELECT * 
FROM myTable 
WHERE (dateAdded <= YourdateValueStart AND YourdateValueEnd IS NULL) 
OR (dateAdded >= YourdateValueEnd AND YourdateValueStart IS NULL) 
OR (dateAdded BETWEEN YourdateValueStart AND YourdateValueEnd) 
+0

我如何格式化字符串“03/12/2010”成为你所拥有的上述接受:YourdateValue – AnApprentice 2010-03-13 23:58:43

4

如果无法格式化你的日期在ColdFusion中YYYY-MM-DD,您可以使用STR_TO_DATE功能在MySQL如下:

SELECT 
    * 
FROM 
    myTable 
WHERE 
    dateAdded <= STR_TO_DATE('03/13/2010','%m/%d/%Y'); 

而且......

SELECT 
    * 
FROM 
    myTable 
WHERE 
    dateAdded BETWEEN STR_TO_DATE('01/11/2000','%m/%d/%Y') AND 
         STR_TO_DATE('03/13/2010','%m/%d/%Y'); 
+0

+1:打我给它。 – 2010-03-13 23:59:11

+0

有没有办法让一个查询既可以处理Date_Start也可以处理Date_END,也可以只处理其中的一个? – AnApprentice 2010-03-13 23:59:33

+0

@nobosh:有可能向我们展示您的coldfusion代码吗?我们可能会提出更好的解决方案。 – 2010-03-14 00:04:15

-1

我相信MySQL你可以在日期上使用比较运算符

所以我觉得你可以

SELECT * 
FROM myTable 
WHERE dateAdded <= 20100111 

and 

SELECT * 
FROMT myTable 
WHERE dateAdded is BETWEEN 20000111 AND 20100303 

在一般情况下,这里的日期操作功能列表,MySQL提供: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.htm

2

最好的方式做到这一点ColdFusion的是使用cfqueryparam管理将字符串转换为日期对象以及提供一定级别的SQL注入预防。

<cfset myResult = queryNew("id")> 
<cfset startDate = "01/11/2000"> 
<cfset endDate = dateFormat(now(), "mm/dd/yyyy")> 

<cfquery name="myResult" datasource="myDatasource"> 
    SELECT * 
    FROM myTable 
    WHERE dateAdded BETWEEN <cfqueryparam CFSQLType="CF_SQL_DATE" value="#startDate#"> 
    AND <cfqueryparam CFSQLType="CF_SQL_DATE" value="#endDate#"> 
</cfquery> 

<cfoutput query="myResult"> 
...output code here 
</cfoutput> 
相关问题