Я не понимаю, почему вам нужно хранить это в столбце таблицы. Как только он будет сохранен, значение будет старым, и его нужно будет обновить снова. (Не делайте этого.) Но установив этот вопрос в стороне на мгновение ...
Относительно того, почему ваш код не «работает» ... Ваш UPDATE
заявление обновляет каждый строку в таблице. Вы предварительно извлекли одну строку из таблицы, а затем рассчитали одно значение, а затем оператор UPDATE
не имеет предложения WHERE, чтобы идентифицировать , который строк, которые вы хотите обновить, поэтому каждая строка обновляется с тем же значением. Это большая часть того, почему ваш код не работает.
И еще не нужно запускать инструкцию SELECT
перед запуском UPDATE
.Если вы хотите обновить все строки в таблице, вы установите столбец в выражение, которое возвращает количество секунд между текущей датой и временем, а также дату и время, хранящиеся в столбце purchasedate
.
Один удобный способ сделать это - использовать функцию UNIX_TIMESTAMP
для преобразования каждого из значений DATETIME в целое значение (количество секунд) и вычесть их. Например:
UPDATE count_sec
SET `second` = UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(purchasedate)
В качестве альтернативы, вы можете использовать функцию TIMESTAMPDIFF для эквивалентного результата:
UPDATE count_sec
SET `second` = TIMESTAMPDIFF(SECOND,NOW(),purchasedate)
Но вернемся к вопросу о том, почему это не так. Вы не хотите хранитьsecond
столбец в таблице.
Когда вы запустите оператор SELECT
, чтобы вернуть строку из таблицы, значение в этом столбце будет старым.
Вместо этого, вы можете просто вернуть рассчитанное значение, рассчитанное по состоянию на момент выполнения SELECT, заявление, путем включения одного из этих выражений в SELECT
списке. Например:
SELECT user_id
, purchasedate
, UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(purchasedate) AS `calc_second`
, `second` AS `old_stored_value`
FROM count_sec
ORDER BY user_id
Точка Я пытаюсь подчеркнуть ... сделать не хранить значение second
в таблице. Вы будете преследовать его и постоянно обновлять каждую строку в таблице, будь то каждые пять минут или каждые пять секунд. И сохраненная ценность всегда будет «старой».
Зачем вам это нужно? Если вы хотите узнать, какие строки в таблице, имеют second
между 60 и 120, например, если вы намерены запустить этот запрос:
SELECT user_id
FROM count_sec
WHERE second > 120
AND second <= 60
Вы можете так же легко переписать, что на основе purchasedate
SELECT user_id
FROM count_sec
WHERE purchasedate > NOW() - INTERVAL 120 SECOND
AND purchasedate <= NOW() - INTERVAL 60 SECOND
И вы не будете «преследовать» непрерывные обновления строк в таблице, генерируя rollbackup, записывая изменения в журнале InnoDB, записывая инструкции UPDATE в двоичные журналы. Если вы используете ведомые службы репликации, эти инструкции должны быть считаны из журнала и повторно выполняться на ведомых устройствах. В целом, хранение second
- это всего лишь плохой выбор дизайна.
Для этого вы можете использовать класс PHP DateTime и метод diff. При переходе по результатам создайте объект DateTime для даты покупки и вычислите разницу между текущей датой. Для получения более подробной информации, посмотрите инструкцию DateTime в руководстве по PHP. – Barry
Хранение столбца 'second' в таблице - это * плохой выбор дизайна, потому что сохраненная ценность будет старой, как только вы ее сохраните, и вы будете постоянно проворачивать ненужные транзакции с базой данных, чтобы попытаться сохранить это значение обновлено. ** Не делайте этого. ** Не храните ** столбец 'second' ** в таблице и постоянно обновляйте его. Это неправильный способ решить любую проблему, которую вы пытаетесь решить. (Я попытался объяснить это в моем ответе ниже). – spencer7593