|
|
|
| Пользователь размещает на сайте отчет. В поле reg (формат date) пишу текущую дату размещения (now()), в поле days хранится кол-во дней до размещения следующего отчета (нпр, 30)
Допустим, отчет нужно размещать каждый месяц до 15 числа (reg=2008-07-15, days=30).
SELECT `reg` + INTERVAL `days` DAY as new FROM form
select date(now())>'".$new['new']."' as flag //если 1, то отчет просрочен
|
Необходимо узнать, что отчет просрочен. Запросы корректны, только если пользователь размещает отчеты только 15 числа, но как быть, если он сделает это раньше (нпр, 10)? | |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 08:36)
| | Вы бы определились уж.
"Отчет надо разместить до 15 числа текущего месяца"
и "отчет надо разместить не позднее чем через 30 дней после размещения предыдущего отчета"
- это разные условия.
Вы проверяете второе. | |
|
|
|
|
|
|
|
для: Trianon
(10.07.2008 в 09:25)
| | а как проверить первое условие?
проблема в том, что несколько отчетов размещаются раз в квартал и.т.д. для этого и добавила поле days | |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 09:37)
| | а если в days хранить дату сл. размещения отчета, при добавлении отчета
добавлять в reg - now(), days: days + interval 4 week, в period хранить периодичность в неделях (1, 4, 12)? | |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 09:37)
| | Если речь о том, чтобы просто проверить, не наступило ли уже 15-е число, то можно и к БД не обращаться:
$flag15 = (intval(date('j')) < 15);
|
Но тут встает вопрос.
Если сегодня сдается отчет за июнь - то он просрочен, несмотря на то, что сегодня еще 10-е.
Если, допустим, через неделю сдается отчет за август - то он сдан вовремя, несмотря на то, что через неделю уже 17-е.
И это при том, что условия о 30 днях мы не рассматриваем совсем.
Надо бы более четко определить, чего хотим узнать :) | |
|
|
|
|
|
|
|
для: Trianon
(10.07.2008 в 10:32)
| | >>>а если в days хранить дату сл. размещения отчета [15.07.2008], при добавлении отчета
добавлять в reg - now() [10.07.2008], days: days + interval 4 week [15.08.2008], в period хранить периодичность в неделях (1, 4, 12)?
т.е. days-now()== 1 >> отчет актуален
==0 >> просрочен
? | |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 10:44)
| | ( неверно все
допустим пользователь решил разместить отчет раньше срока/ нашел ошибку и загрузил его снова. дата в поле каждый раз передвигается на period.
$newrepdate=mysql_query("SELECT `reg`, `new` FROM form where id_form='".$row['id']."'");
$new = mysql_fetch_array($newrepdate);
$check=mysql_query("select '".$new['new']."' > date(now()) as flag");
$c=mysql_fetch_array($check);
if ($c['flag']==0) // отчет просрочен
{
$pr=mysql_query("SELECT to_days(now())-to_days('".$new['new']."') as srok");
$srok = mysql_fetch_array($pr);
$color="red";
$text=" (дней просрочки ".$srok['srok'].")";
}
else
{
$color="#006699";
$text="";
}
Добавление отчета:
$query=mysql_query("UPDATE form SET reg = now(), new = new + interval '".$res['period']."' Day WHERE id_form='".$res['id_form']."'"); // период (7 дней, 31, 93)
|
| |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 11:42)
| | По-моему, нужно позволить пользователю в форме загрузки отчета указывать месяц и год в отдельном поле (полях).
Месяц и год, за который делается отчет.
Иначе неопределенки Вам не избежать.
При подготовке умалчиваемых полей формы можно учитывать и текущую дату и наличие строк в таблице БД. Но поле тем не менее позволять менять. | |
|
|
|
|
|
|
|
для: Trianon
(10.07.2008 в 11:48)
| | спасибо. это вариант. а как быть с неделей/кварталом? | |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 12:09)
| | А какие с ними сложности?
Я не совсем понял проблему. Точнее - совсем не понял. | |
|
|
|
|
|
|
|
для: Trianon
(10.07.2008 в 12:17)
| | а почему нельзя месяц из now сравнивать с мес. поля new? если они не совпадают, то смещаем new на period? | |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 12:26)
| | Почему нельзя? Можно.
Вы можете запросить год от даты ( неважно - текущей, из поля или из предвычисленной константы, как у Вас в $new) можете запросить месяц, можете год и месяц вместе.
SELECT YEAR(NOW()),MONTH(NOW()), LEFT(NOW(),7)
|
Между прочим первый запрос (который у Вас из двух состоит)
$newrepdate=mysql_query("SELECT `reg`, `new` FROM form where id_form='".$row['id']."'");
$new = mysql_fetch_array($newrepdate);
$check=mysql_query("select '".$new['new']."' > date(now()) as flag");
$c=mysql_fetch_array($check);
if ($c['flag']==0) // отчет просрочен
|
можно (и нужно наверное) записать одним:
$newrepdate=mysql_query("SELECT `reg`, `new`, (date(`new`) > date(now())) AS flag FROM form where id_form='".$row['id']."'");
$new = mysql_fetch_array($newrepdate);
if ($new['flag']==0) // отчет просрочен
|
| |
|
|
|
|
|
|
|
для: Trianon
(10.07.2008 в 12:40)
| | да, спасибо.
и еще один вопрос.
как узнать что даты в одном квартале года?
if ($res['period']=='31') .
{
$check=mysql_query("select MONTH('".$res['new']."') = MONTH(date(now())) as flag");
$c=mysql_fetch_array($check);
}
if ($res['period']=='7')
{
$check=mysql_query("select WEEK('".$res['new']."') = WEEK(date(now())) as flag");
$c=mysql_fetch_array($check);
}
|
| |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 13:23)
| | QUARTER .
спасибо. | |
|
|
|
|
|
|
|
для: o.k.computer
(10.07.2008 в 13:23)
| | Номер квартала средствами mysql можно определить с помощью функции QUARTER().
SELECT QUARTER(NOW()) AS quarter
Год и квартал вместе можно получить, сцепив вместе одно с другим:
SELECT CONCAT(YEAR(NOW()), '/', QUARTER(NOW())) AS quarter
Для определения номера недели в году имеются функции WEEK() и WEEKOFYEAR()
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_week | |
|
|
|