查询的Coldfusion查询缺少来自日期BETWEEN子句的结果

时间:2012-06-01 15:23:02

标签: sql date coldfusion between

我有一个名为AllPosts的查询来自查询。

AllPosts有两个结果:

Row 1| ID: 2   PublishedDate: 2012-05-30 16:47:00.0
Row 2| ID: 3   PublishedDate: 2012-05-31 15:50:00.0

当我使用

查询AllPosts上的一个名为FilterPosts的查询时
WHERE PublishedDate BETWEEN '2012-05-01 00:00:00' AND '2012-05-31 23:59:00'

(请注意,实际查询正在为这些值执行cfqueryparam cf_sql_date)

我希望FilterPosts与AllPosts具有相同的行,而我只获得ID 2.如果我将ID 2的发布日期更改为2012-05-30 23:59:50.0,则FilterPosts会返回正确的结果。

我也试过

WHERE PublishedDate >= '2012-05-01 00:00:00'   
AND   PublishedDate <= '2012-05-31 23:59:00'   

5月31日有些奇怪的东西。

我把头发拉出来了!谢谢!

我试着用它来构建原始查询,奇怪的是,结果相同!

<cfset test = queryNew("Name,PublishedDate", "VarChar, Time" )>
<cfset queryAddRow(test)>    
<cfset querySetCell(test,"PublishedDate","2012-05-30 16:47:00.0")>     
<cfset querySetCell(test,"Name","First Entry")>    
<cfset queryAddRow(test)>    
<cfset querySetCell(test,"PublishedDate","2012-05-31 15:47:00.0")>    
<cfset querySetCell(test,"Name","Second Entry")>    

<cfset StartDate = CreateDate(2012, 5, 1)>

<cfquery name="filter" dbtype="query">    
    SELECT Name, PublishedDate    
    FROM    test
WHERE    1=1
AND PublishedDate >= <cfqueryparam value="#StartDate#" cfsqltype="cf_sql_date">
AND PublishedDate <= <cfqueryparam value="#DateAdd( 'n', -1, DateAdd('m', 1, StartDate) )#" cfsqltype="cf_sql_date">
 </cfquery>

Filter的结果只有'FirstEntry',而不是两者都应该。

3 个答案:

答案 0 :(得分:3)

您没有说明您正在使用哪个数据库,但如果它是ODBC或MSSQL,我通常会这样做:

WHERE PublishedDate >= '2012-05-01'
AND PublishedDate < '2012-06-01'

基本上,您将一天添加到要包含的结束日期并使用小于运算符。离开时间可以避免任何关于如何在内部构建日期的奇怪之处。

答案 1 :(得分:3)

奇怪的是,它与cfqueryparam有关。我一直在使用CreateDate()来创建我的开始/结束日期:

<cfset StartDate = CreateDate(2012,5, 1)>

我在查询查询中的SQL WHERE中使用它,如下所示:

WHERE PublishedDate >=  <cfqueryparam value="#StartDate#" cfsqltype="cf_sql_date">

那是cf_sql_date。它应该是cf_sql_timestamp日期将其限制为5-31,因此在5-31的当天晚些时候发布的任何内容都被省略。会议纪要在下降。

感谢大家的投入。

修复遗留代码!

答案 2 :(得分:1)

通过从日期时间删除timepart来尝试比较。因此,between应该是

WHERE PublishedDate BETWEEN '2012-05-01' AND '2012-05-31'