#sql #datediff
#sql #datediff
Вопрос:
Я пытаюсь вычислить разницу между двумя датами, текущей датой и датой подписки моих пользователей на сайте. Если разница составляет более 30 дней, я отключаю их подписку. Я просто не могу заставить это работать.
$strFind="SELECT DATEDIFF(date, curdate()) AS total FROM `monthlydues` WHERE `memid`="$curmemid" ORDER BY `id` DESC LIMIT 1";
$result=mysql_query($strFind) or die(mysql_error());
$row=mysql_fetch_array($result);
$gtime=$row['total'];
if($gtime>30){
$strsql="UPDATE monthlydues SET `active`='N' WHERE `memid`="$curmemid"";
mysql_query($strsql,$connect) or die(mysql_error());
$chkrow5=mysql_affected_rows($connect);
}
Комментарии:
1. Что это за система базы данных. Пожалуйста, укажите, потому что это имеет большое значение.
2. Можете ли вы быть более конкретным? Что не работает? Какое значение «total» найдено?
3. Это база данных MYSQL, значение неверное. Значение $ gtime вычисляется как > 30, и база данных обновляется, устанавливая поле таблицы активным на ‘N’
Ответ №1:
Почему не один оператор?
UPDATE monthlydues
SET `active`='N'
WHERE DATEDIFF(curdate(), date) > 30
Итак, это?
$strsql="UPDATE monthlydues SET `active`='N' WHERE DATEDIFF(curdate(), `date`) > 30";
Ответ №2:
Вы должны указать, какого рода разницу вы хотите.
Например, для SQL Server вы указываете разницу в днях следующим образом:
DATEDIFF(day, date, curdate())
Ответ №3:
Вам может помочь следующее, хотя это зависит от того, что именно вы хотите сделать; Этот запрос будет работать со всеми участниками, а не только с участником, идентифицируемым указанным идентификатором:
UPDATE monthlydues SET active = 'N'
WHERE DATEDIFF(NOW(), `date`) > 30;
Если вы хотите настроить таргетинг на определенный элемент, просто добавьте ограничение:
UPDATE monthlydues SET active = 'N'
WHERE memid = :memberid
AND DATEDIFF(NOW(), `date`) > 30;
РЕДАКТИРОВАТЬ: NOW () — это функция MySQL. Вероятно, будет отличаться на разных движках