Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: период
 
 автор: o.k.computer   (10.07.2008 в 08:36)   письмо автору
 
 

Пользователь размещает на сайте отчет. В поле 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)?

   
 
 автор: Trianon   (10.07.2008 в 09:25)   письмо автору
 
   для: o.k.computer   (10.07.2008 в 08:36)
 

Вы бы определились уж.
"Отчет надо разместить до 15 числа текущего месяца"
и "отчет надо разместить не позднее чем через 30 дней после размещения предыдущего отчета"
- это разные условия.
Вы проверяете второе.

   
 
 автор: o.k.computer   (10.07.2008 в 09:37)   письмо автору
 
   для: Trianon   (10.07.2008 в 09:25)
 

а как проверить первое условие?
проблема в том, что несколько отчетов размещаются раз в квартал и.т.д. для этого и добавила поле days

   
 
 автор: o.k.computer   (10.07.2008 в 10:26)   письмо автору
 
   для: o.k.computer   (10.07.2008 в 09:37)
 

а если в days хранить дату сл. размещения отчета, при добавлении отчета
добавлять в reg - now(), days: days + interval 4 week, в period хранить периодичность в неделях (1, 4, 12)?

   
 
 автор: Trianon   (10.07.2008 в 10:32)   письмо автору
 
   для: o.k.computer   (10.07.2008 в 09:37)
 

Если речь о том, чтобы просто проверить, не наступило ли уже 15-е число, то можно и к БД не обращаться:
$flag15 = (intval(date('j')) < 15);


Но тут встает вопрос.
Если сегодня сдается отчет за июнь - то он просрочен, несмотря на то, что сегодня еще 10-е.
Если, допустим, через неделю сдается отчет за август - то он сдан вовремя, несмотря на то, что через неделю уже 17-е.
И это при том, что условия о 30 днях мы не рассматриваем совсем.

Надо бы более четко определить, чего хотим узнать :)

   
 
 автор: o.k.computer   (10.07.2008 в 10:44)   письмо автору
 
   для: 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 в 11:42)   письмо автору
 
   для: 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)     

   
 
 автор: Trianon   (10.07.2008 в 11:48)   письмо автору
 
   для: o.k.computer   (10.07.2008 в 11:42)
 

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

Иначе неопределенки Вам не избежать.

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

   
 
 автор: o.k.computer   (10.07.2008 в 12:09)   письмо автору
 
   для: Trianon   (10.07.2008 в 11:48)
 

спасибо. это вариант. а как быть с неделей/кварталом?

   
 
 автор: Trianon   (10.07.2008 в 12:17)   письмо автору
 
   для: o.k.computer   (10.07.2008 в 12:09)
 

А какие с ними сложности?
Я не совсем понял проблему. Точнее - совсем не понял.

   
 
 автор: o.k.computer   (10.07.2008 в 12:26)   письмо автору
 
   для: Trianon   (10.07.2008 в 12:17)
 

а почему нельзя месяц из now сравнивать с мес. поля new? если они не совпадают, то смещаем new на period?

   
 
 автор: Trianon   (10.07.2008 в 12:40)   письмо автору
 
   для: 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) // отчет просрочен 

   
 
 автор: o.k.computer   (10.07.2008 в 13:23)   письмо автору
 
   для: 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:47)   письмо автору
 
   для: o.k.computer   (10.07.2008 в 13:23)
 

QUARTER .

спасибо.

   
 
 автор: Trianon   (10.07.2008 в 13:58)   письмо автору
 
   для: 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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования