在MySQL查询中使用Coldfusion DateDiff?

时间:2012-01-10 16:56:16

标签: mysql coldfusion datediff

我花了几个小时玩这个,到目前为止没有成功。

我正在输出一个非常大的查询,并尝试在处理数据之前将其拆分为块。此查询基本上每天都会运行,其中一个字段('last_checked')将用于确保每天不会多次处理相同的数据。

这是我现有的查询;

<cfquery name="getprice" maxrows="100">
  SELECT ID, source, last_checked, price
  FROM product_prices
  WHERE source='api'
  ORDER BY ID ASC
</cfquery> 

然后我对结果运行cfoutput查询以进行各种更新。该表目前只有100,000多条记录,并且开始努力处理所有内容,因此需要将其拆分为块。

我的意图是cfschedule它经常运行(例如,我会增加最大值并且可能每15分钟运行一次)。但是,我只需要返回过去24小时内未更新的结果 - 这就是我遇到的问题。

我知道MySQL有它自己的DateDiff和TimeDiff函数,但我似乎无法掌握它的语法 - 如果它确实适用于我的用途(文档似乎在这方面自相矛盾 - 或者,至少我读过的那些。)

非常感谢任何指针!

2 个答案:

答案 0 :(得分:1)

首先尝试使用MySQL:

SELECT ID, source, last_checked, price
  FROM product_prices
  WHERE source='api'
      AND last_checked >= current_timestamp - INTERVAL 24 HOUR
  ORDER BY ID ASC

答案 1 :(得分:1)

我会提醒您不要在cfquery中使用maxrows=100。这仍将从数据库返回CF的完整记录集,然后CF将过滤除前100行以外的所有记录集。当您处理100,000行数据集时,这将非常昂贵。据推测,过去24小时内的过滤器将大大减小基本结果集的大小,因此这可能不是一个大问题。但是,如果您发现即使将您的设置限制为在过去24小时内更改的设置,您仍然可以使用非常大的记录集,您可以更改这种方式以更有效地工作。 MySQL不是使用CF来过滤结果,而是使用查询中的LIMIT关键字来执行此操作:

SELECT ID, source, last_checked, price
  FROM product_prices
  WHERE source='api'
      AND last_checked >= current_timestamp - INTERVAL 1 DAY
  ORDER BY ID ASC
LIMIT 0,100

您还可以通过在LIMIT之前添加偏移值来轻松地在100行的“页面”之间进行设置:LIMIT 300, 100将是结果集中的行300-400。以这种方式进行分页比将其卸载到CF要快得多。