2012-01-10 66 views
0

我已經花了幾個小時玩這個,到目前爲止沒有成功。在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條記錄,並且正在努力處理一個命中中的所有內容,因此需要將其分割成塊。

我的意圖是讓cfs安排它每隔多久運行一次(我會增加maxrows,並可能每15分鐘運行一次)。不過,我需要它僅返回在過去24小時內未更新的結果 - 這是我陷入困境的地方。我知道MySQL有它自己的DateDiff和TimeDiff函數,但我似乎無法掌握它的語法 - 如果它的確適用於我的使用(文檔在這方面似乎與它自己矛盾 - 或者,至少我讀過的)。

非常感謝任何指針!

回答

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 
+0

謝謝埃裏克,我已經完全按照您輸入的那樣粘貼了它,但它給了我一個語法錯誤。我以前從來沒有遇到INTERVAL,而且我能找到的唯一例子與創建活動有關,所以我無法從哪裏開始! – Lee 2012-01-10 17:34:18

+2

嘗試將其更改爲HOUR而不是HOURS – 2012-01-10 18:11:28

+0

@JakeFeasel - 謝謝! – Eric 2012-01-10 18:18:54

1

我會警告你不要在你的CFQUERY使用maxrows=100。這仍然會從數據庫中將完整記錄集返回給CF,並且只有這樣CF纔會過濾出除前100行之外的所有記錄集。在處理100,000行數據集時,這將會非常昂貴。據推測,只過去24小時的過濾器會大大減少基本結果集的大小,所以也許這不會是一個大問題。但是,如果您發現即使將您的設置限制爲在過去24小時內更改的設置,仍然有大量記錄需要處理,您可以更改這種方式以更有效地工作。除了使用CF篩選結果中,有mysql做使用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 

你也很容易被限制之前加上偏移值設置100行的「頁面」之間:LIMIT 300, 100應該是結果集中的300-400行。以這種方式進行分頁將比將分頁卸載到CF要快得多。

+0

謝謝傑克,非常好 - 我真的應該更頻繁地使用LIMIT! – Lee 2012-01-11 18:47:12