Используя Coldfusion DateDiff в MySQL Query? - PullRequest
0 голосов
/ 10 января 2012

Я потратил несколько часов на то, чтобы поиграть с этим, но пока безуспешно.

Я выводлю очень большой запрос и пытаюсь разбить его на куски перед обработкой данных.Этот запрос будет в основном выполняться каждый день, и одно из полей ('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 записей и начинает бороться за обработку всего одним попаданием, поэтому необходимо разбить ее на куски.

Мое намерение состоит в том, чтобы планировать его запуск так часто (увеличить максроу и, вероятно, запускать его каждые 15 минут, например).Однако мне нужно, чтобы он возвращал только результаты, которые не были обновлены в течение последних 24 часов - вот где я застреваю.

Я знаю, что MySQL имеет свои собственные функции DateDiff и TimeDiff, но я неКажется, что я не могу понять синтаксис для этого - если это действительно применимо для моего использования (документы кажутся противоречащими друг другу в этом отношении - или, по крайней мере, те, которые я читал).

Любойочень ценят указатели!

Ответы [ 2 ]

1 голос
/ 10 января 2012

Я бы предостерег вас от использования maxrows=100 в вашем cfquery. Это все равно вернет полный набор записей в 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: LIMIT 300, 100 будет строк 300-400 из вашего набора результатов. Выполнение пейджинга таким способом будет намного быстрее, чем разгрузка на CF.

1 голос
/ 10 января 2012

Попробуйте сначала с 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
...