【问题标题】:Coldfusion Query of Query missing results from date BETWEEN clauseColdfusion Query of Query missing results from date BETWEEN 子句
【发布时间】:2012-06-01 15:23:01
【问题描述】:

我从一个查询的查询中有一个名为 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

当我使用

对名为 FilterPosts 的 AllPosts 进行查询时
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' 而不是两者都应该的。

【问题讨论】:

  • 尽管在我的所有代码行前面放置了 4 个空格,但它不会保留格式。你做了什么不一样的事!?感谢编辑!
  • 两边也需要一个空行——后面有空格,之前没有。

标签: sql date coldfusion between


【解决方案1】:

你没有说你使用的是哪个数据库,但如果是 ODBC 或 MSSQL,我通常会这样做:

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

基本上,您将一天添加到要包含的结束日期并使用小于运算符。省略时间可以防止内部构造日期的方式出现任何异常。

【讨论】:

  • 感谢您的回答。原始源数据库是 MS SQL,但它特别是 Query of a Query 问题。原来,AllPosts 有正确的数据(它也恰好是查询的查询)。过滤后的帖子。我正在使用 CreateDate 来获取星号/结束日期。它似乎自己增加了几秒钟。
  • 我倾向于避免 Q of Q,因为我过去见过类似的怪事,但请理解为什么您可能希望他们保存第二次访问 DB。如果您按照建议使用简单日期,它仍然会失败吗?
  • 即动态术语尝试:PublishedDate &lt; &lt;cfqueryparam value="#DateAdd('m', 1, StartDate)#" cfsqltype="cf_sql_date"&gt;。它应该可以正常工作。
【解决方案2】:

奇怪的是,它与 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 发布的任何内容都被省略了。时间在减少。

感谢大家的意见。

修复遗留代码问题!

【讨论】:

  • 很高兴你把它修好了,这与我在 00:00 时间戳时将一天加到最后以 6-1 的结果相同。
  • +1 对 Turnkey 的建议。通过使用Col &lt; #dayAfterEndDate#,您不必担心像这样的时间部分问题。我经常使用它,效果很好。
【解决方案3】:

尝试通过从日期时间中删除 timepart 进行比较。所以你的between 应该是这样的

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

【讨论】:

  • 这对于开始日期来说是可以的,但仍然会删除 5 月 31 日的记录,因为这就像在说:PublishedDate &gt;= '2012-05-01 00:00:00.0' AND PublishedDate &lt;= '2012-05-31 00:00:00.0'
  • @Leigh,在这种情况下,我们需要将上限更改为 2012-06-01 而不是 2012-05-31
  • 是的,但BEWTWEEN 通常是包容性的,这意味着它还会获取标记为“2012-06-01 00:00:00.0”的记录。因此,与 Turnkey 的方法不同的是,仍有很小的机会拾取不需要的记录。
  • @Leigh,没错,这就是between 所做的对吗?包括上限和下限。我选择了BETWEEN,因为 OP 要求相同。
  • 是的,但我认为他希望所有记录日期在 2012 年 5 月的任何时候。不同之处在于您的查询将包括日期为 6 月 1 日午夜的记录,而 Turnkey 的将不是(因为&lt;)。所以结果略有不同。换句话说,您的查询说包括 6 月 1 日午夜,他说排除它。
猜你喜欢
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
相关资源
最近更新 更多