2015-06-06 1 views
-1

Я хочу минус дата покупки с помощью datenow. я таблица с именем count_sec:Как datenow минус datetime MySQL с PHP во втором

|user_id| purchasedate |second| 
| 1 |2015-06-06 08:36:05|  | 
| 2 |2015-06-06 08:36:15|  | 

пример Время 2015-06-06 08:37:00 что код, если я хочу код, чтобы обновить второй в:

|user_id| purchasedate |second| 
| 1 |2015-06-06 08:36:05| 55 | 
| 2 |2015-06-06 08:36:15| 45 | 

спасибо

EDIT я уже создать этот PHP, но код не работа, как исправить?

<?php 
require 'database/db.php'; 

$selectprchsdate = $mysqli->query("SELECT purchasedate FROM count_sec"); 
$row = mysqli_fetch_assoc($selectprchsdate); 
$date = date('Y-m-d H:i:s'); 

$result = $date - $row['purchasedate']; 

$mysqli->query("UPDATE count_sec 
       SET second = '".$result."'"); 

?> 
+0

Для этого вы можете использовать класс PHP DateTime и метод diff. При переходе по результатам создайте объект DateTime для даты покупки и вычислите разницу между текущей датой. Для получения более подробной информации, посмотрите инструкцию DateTime в руководстве по PHP. – Barry

+0

Хранение столбца 'second' в таблице - это * плохой выбор дизайна, потому что сохраненная ценность будет старой, как только вы ее сохраните, и вы будете постоянно проворачивать ненужные транзакции с базой данных, чтобы попытаться сохранить это значение обновлено. ** Не делайте этого. ** Не храните ** столбец 'second' ** в таблице и постоянно обновляйте его. Это неправильный способ решить любую проблему, которую вы пытаетесь решить. (Я попытался объяснить это в моем ответе ниже). – spencer7593

ответ

-2

Вы можете использовать TIMESTAMPDIFF() функцию, как показано ниже. См Documentation

SELECT TIMESTAMPDIFF(SECOND, NOW(), purchasedate) 
from count_sec; 

(OR), если вы хотите UPDATE

UPDATE count_sec SET `second` = TIMESTAMPDIFF(SECOND, NOW(), purchasedate); 

За свой комментарий, если вы хотите отложить в течение 5 минут, а затем либо вы можете использовать

SLEEP(seconds) функция

(OR)

Wrap Ваш Updation код в хранимой процедуре и запустить, что через каждые 5 минут (возможно, используя некоторые планировщик заданий)

+0

Не уверен, что я понял ваш вопрос? – Rahul

+0

См. Редактирование в ответ. Если это поможет. – Rahul

+0

Кто бы ни пытался, отправьте комментарий с указанием причины. – Rahul

1

Попробуйте с запросом SQL:

SELECT UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(purchasedate) as second from countsec 

или это:

SELECT TO_SECONDS(NOW()) - TO_SECONDS(purchasedate) as second from countsec; 

От MySQL Date and Time Functions

+0

Это правильный подход к решению проблемы. Ответ на вопрос ОП: ** не хранить ** вычисленное значение в таблице и постоянно преследовать это с обновлениями каждой строки в таблице. Правильный ответ - рассчитать значение в момент вытягивания строки из таблицы. – spencer7593

1

В PHP вы можете использовать

// get current date and time 
$now = new DateTime(); 
// create DateTime object for purchase date 
$purchaseDate = DateTime::createFromFormat('Y-m-d H:i:s', $row['purchasedate']); 
// calculate seconds 
$seconds = $now->getTimeStamp() - $purchaseDate->getTimeStamp(); 

Но костюмы SQL решения этого вопроса лучше.

+0

Правильный ответ, рекомендует постоянно обновлять ненужный столбец в каждой строке таблицы. ** + 1 **. Вычисление может выполняться как на PHP, так и на SQL ... одна вещь, которая должна быть осведомлена о часовом поясе соединения MySQL. В выражении SQL «NOW()» и «buyate» оцениваются в одном и том же часовом поясе. С PHP часовой пояс «buyate» от сервера базы данных «$ now» может быть разным часовым поясом. – spencer7593

0

Я не понимаю, почему вам нужно хранить это в столбце таблицы. Как только он будет сохранен, значение будет старым, и его нужно будет обновить снова. (Не делайте этого.) Но установив этот вопрос в стороне на мгновение ...

Относительно того, почему ваш код не «работает» ... Ваш 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 - это всего лишь плохой выбор дизайна.

Смежные вопросы