Перейти к содержимому


Напоминание, разница дат числом.

Напоминание разница дат числ

Сообщений в теме: 12

#1 shambler81

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 98 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 27 Сентябрь 2012 - 11:33

Напоминание, разница дат числом.
Требуется срочно продлить доменное имя test.ru осталось 7 дней.

Само условие работает красиво, а вот выввести в само напоминание не число 10.10.2012 а разницу менжу сегодняшним и датой окончания.

условие

(left(`Оплачен до`,10)<curdate() + INTERVAL 30 DAY and `Оплачен до`!='0000-00-00 00:00:00') and `Уведомлять`='Да'

Вывод
Домен {Домен} требуется срочно продлить!!!



Требуется
Домен {Домен} требуется срочно отпатить, осталось 7дней ????

А как сделать то?

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 27 Сентябрь 2012 - 14:31

Добавьте в таблицу вычисляемое поле, которое будет выдавать число дней, и соответственно вставьте его в текст напоминания.

#3 shambler81

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 98 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 27 Сентябрь 2012 - 15:40

Цитата

Добавьте в таблицу вычисляемое поле, которое будет выдавать число дней, и соответственно вставьте его в текст напоминания.
Этот вариант понятен и так ;(

А прям в условие вывода информации нельзя так сделать?
Помоему что то такое было в примере комерческого предложения там какое то условие выполняется прям в форме письма.
Может можно сделать прям в тексте вычисления ?

В принципе в данном случае я подумал сделать более целесообразно как вы предложили инфа всеже полезная а то у нас менеджер туп ;) да ифильтрация по этому значению в таблице пойдет. Но в общем и целом можно ли сделать именно вычисления прям в форме напоминания ?
Даже если будет через адвансет? Просто если есть возможность знать как делать.

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 27 Сентябрь 2012 - 15:50

Какое отношение условие может иметь к тексту напоминания? Это принципиально разные вещи. В самом тексте тоже никаких вычислений быть не может, разумеется. Так что вычисляемое поле - единственный вариант.

#5 shambler81

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 98 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 27 Сентябрь 2012 - 15:55

Ок понял.

Сообщение отредактировал shambler81: 27 Сентябрь 2012 - 15:57


#6 shambler81

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 98 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 27 Сентябрь 2012 - 19:54

Кэп попробовал, встал на месте где вообще не ожидал
не могу перевести дата - дата = обычное число.

$line['Дней до отключения'] =  date ("d-m-Y 00.00.00") - $line['Оплачен до'] ;

А вот дальше мозг кончился.
что то вроде :

#var start = new Date; #
#		 for (var i=0; i<100000; i++) {#
#	  var doSomething = i*i*i;
#	}
#	
#	var end = new Date;
#	
#	alert("Цикл занял " + (end-start) + " ms");
Но не выходит ничего.

Сообщение отредактировал shambler81: 27 Сентябрь 2012 - 19:55


#7 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 28 Сентябрь 2012 - 09:45

Разницу дат нельзя посчитать простым вычитанием, т.к. дата в php - это обычная строка. Для начала необходимо перевести обе даты в формат unixtime, затем собственно вычислить разницу в секундах, после чего перевести секунды в нужные единицы.

$opl_do = strtotime($line['Оплачен до']) ; // переводим дату оплаты в unixtime
$curtime = time(); // текущее время в формате unixtime
$diff = $opl_do - $curtime; // находим разницу в секундах (у вас кстати порядок дат был перепутан)
$line['Дней до отключения'] =  $diff/86400; // делим число секунд на кол-во секунд в сутках - находим число дней


#8 shambler81

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 98 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 28 Сентябрь 2012 - 11:10

Спасибо шеф!
а порядок да, косяк вставил не првильно для вас по быстрой накидал чтоб хоть поняно про что разговор.

Сообщение отредактировал shambler81: 28 Сентябрь 2012 - 11:11


#9 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 12 Ноябрь 2012 - 18:23

Просмотр сообщенияCbCoder (28 Сентябрь 2012 - 09:45) писал:

Разницу дат нельзя посчитать простым вычитанием, т.к. дата в php - это обычная строка. Для начала необходимо перевести обе даты в формат unixtime, затем собственно вычислить разницу в секундах, после чего перевести секунды в нужные единицы.

касательно разницы дат
как получать целое число дней?

если через Unix time
то получится что между 11.11.12 23:59 и 12.11.12 07:59 разница будет примерно 0,3 суток ()
кстати такая же ерунда будет если сравнить разницу между 12.11.12 8:00 и 12.11.12 16:00
или я не прав?

а как сделать так чтобы всегда 12.11.12 минус 11.11.12 было равно 1, а 12.11.12 минус 12.11.12 всегда было равно 0. И не важно какое время 00:00 или 23:59 у каждой даты.

я тупо сделал округление в меньшую сторону (floor), но если я вчера поздно проверю дату и запишу данные, а сегодня рано проверю то ничего не сработает.



//получение максимальной даты в таблице
$sqlQuery = "SELECT max(`f1495`) AS maximumdate FROM `".DATA_TABLE."122` WHERE `status`<>'2'";
$result = mysql_query($sqlQuery) or user_error(mysql_error() . "<br>" . $sqlQuery . "<br>", E_USER_ERROR);
$row = mysql_fetch_assoc($result);
//echo "<script>alert('Максимальная дата в таблице ".$row['maximumdate']."')</script>";

$dol=$row['maximumdate'];
//echo "<script>alert('Unix дата".$dol."')</script>";
$todaydate=date("Y-m-d H:i:s"); // 2001-03-10 17:16:18 (the MySQL DATETIME format)

//echo "<script>alert('Сегодня дата".$todaydate."')</script>";

//Разница дат в UNIX формате деленное на количеаство секунд в прошедших сутках
$differencedate=(strtotime($todaydate)-strtotime($dol))/3600/24;
//Округление даты до целого количества дней - [u][b]вот здесь и будет  то несоответствие о котором я писал вышел[/b][/u]
$differencedate2=floor($differencedate);

//цикл для пересчета даты с последней в базе до текущей
for ($i = 1; $i <= $differencedate2 ; $i++) {
   $sleddate=date("d/m/y",(strtotime($dol)+($i*3600*24)));
    echo "<script>alert('".$sleddate."')</script>";
}





#10 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 13 Ноябрь 2012 - 09:36

Используйте дату без времени, тогда проблем с округлением не будет. Например, для расчета текущей даты необходимо использовать date("Y-m-d") или date("Y-m-d 00:00:00"), а не date("Y-m-d H:i:s"), как у вас в примере. Если из базы возвращается тоже дата на полночь (в настройках поля не стоит "показывать время"), то проблем тогда вообще нет. Если же дата со временем, то просто сотрите время функцией substr.

#11 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 13 Ноябрь 2012 - 10:24

спасибо за подсказку
попробуем

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

#12 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 13 Ноябрь 2012 - 10:36

Почему это не срабатывает, не понял? Может вы путаете с выводом через echo - то что не успеваете его прочесть, из-за перезагрузки страницы? Тогда поставьте exit после echo.

Вообще, доп. действия не предназначены для вывода информации, их функция - изменение данных. Для вывода служат отчеты.

#13 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 13 Ноябрь 2012 - 11:38

Просмотр сообщенияCbCoder (13 Ноябрь 2012 - 10:36) писал:

Почему это не срабатывает, не понял? Может вы путаете с выводом через echo - то что не успеваете его прочесть, из-за перезагрузки страницы? Тогда поставьте exit после echo.

Вообще, доп. действия не предназначены для вывода информации, их функция - изменение данных. Для вывода служат отчеты.
Наверное вы правы
просто echo мне служит для получения информации в момент отладки - я просто по другому не умею получать информацию о срабатывании отдельных кусков (все таки я не программист PHP). После того как все будет работать все echo будут закомментированы.





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных