Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка дня недели в месяце, Проверить является ли день недели вторым 
:(
    Опции темы
Akina
Дата 20.6.2014, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(McDoc @  20.6.2014,  14:43 Найти цитируемый пост)
Обновил одну из записей, добавл вместо номера недели 
Код

where weekday(mydate) != weekday(mydate + interval 1 week);

Я поправил опечатку. Но и тебе надо бы думать, а не тупо копипастить... не правда ли, будет странно, если ровно через неделю будет не тот же день недели...

Добавлено через 2 минуты и 6 секунд
Цитата(McDoc @  20.6.2014,  14:43 Найти цитируемый пост)
Какого хрена он выводит запись для Четвертой недели, когда сейчас пятая (по компу) - не понимаю (((( 

Последняя пятница и пятница последней недели - вовсе не одно и тоже...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
McDoc
Дата 20.6.2014, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



Akina - Спасибо тебе за помощь, но ты можешь толком объяснить, что куда вставляется?

Вот эта часть кода в таблицу, вместо так называемого Last?
Код

WHERE
  CASE frequency
    WHEN 'First' THEN month(mydate) != month(mydate - interval 1 week)
    WHEN 'Last' THEN month(mydate) != month(mydate + interval 1 week)
    ELSE 0
END


Я не могу понять откуда ты посылаешь WHEN 'First'  или WHEN 'Last' - это по идее если ты выбираешь Last or First.

И я уже мозг поломал, что значит Последняя пятница и пятница последней недели вовсе не одно и тоже.

Ты имел в виду что последняя пятница - это последняя пятница года? 

Это мой первый опыт с подобным, и до супер пупер пользования SQL мне далеко, а задания нужно выполнять.
Я понимаю, ты тратишь свое время, но ты можешь написать Step by Step? Что за чем?
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 23.6.2014, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(McDoc @  20.6.2014,  18:19 Найти цитируемый пост)
 ты можешь написать Step by Step?

Не-а... ведь до сих пор не поставлена строгая задача. То тебе хранить, то проверять, то выбирать, то вообще неясно что...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
McDoc
Дата 23.6.2014, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



Цитата(Akina @ 23.6.2014,  08:05)
Цитата(McDoc @  20.6.2014,  18:19 Найти цитируемый пост)
 ты можешь написать Step by Step?

Не-а... ведь до сих пор не поставлена строгая задача. То тебе хранить, то проверять, то выбирать, то вообще неясно что...

Спасибо, за еще за одну науку.

1 - Есть готовая ДБ.
2 - Есть колонна frequency в которой прописывается аргумент (номер недели 1, 2, 3, 4)
3 - Какой аргумент соответствует последней недели Last? Так как последний может быть 4, 5 или даже 6

Нужно для начала выправить запрос. Который уже есть (если он неправильный), или написать, какой аргумент нужно поместить в таблицу в колонку frequency, что бы он соответствовал ПОСЛЕДНЕЙ недели месяца.

Код

SELECT  `description` AS  'Task', DATE_FORMAT( current_date,  '%d %b %y' ) AS  'Current date',  `start_time` AS  'Time'
FROM tasks
WHERE  `code` LIKE  'monthly'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
AND  `day_of_week` = DAYOFWEEK( current_date ) 
AND  `month_of_year` = MONTHNAME( current_date ) 
AND `frequency` = WEEKDAY (current_date)
ORDER BY  `start_time`

PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 23.6.2014, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(McDoc @  23.6.2014,  12:20 Найти цитируемый пост)
3 - Какой аргумент соответствует последней недели Last? Так как последний может быть 4, 5 или даже 6

Нормально так... это уже ТЫ должен определить, что там будет стоять, если данное задание следует выполнять в последнюю неделю. Т.е. например так:

Код

Неделя frequency
   1       1
   2       2
   3       3
   4       4
   5       5
   6       6
First     11
Second    12
Third     13
Forth     14
Fifth     15
Sixth     16
Last      21



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
McDoc
Дата 23.6.2014, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



Хорошо.
Для упрощения возьмем:

Неделя - Аргумент
1           -        1
2           -        2
3           -        3
4           -        4
5           -        5
Last      -        21

Так как WEEKDAY - понимает только цифры - http://dev.mysql.com/doc/refman/5.6/en/dat...unction_weekday - верно ли это?

Когда пользователь в Форме (форма на странице HTML и РНР) выбирает Неделя 1, 2, 3, 4, 5 или Last (для отправки данных в таблицу) -  у нас в таблицу идет аргумент 21. Верно?

На данный момент мы имеем таблицу и в ручную вносим аргумент 21.
user posted image

У нас имеется три записи на Понедельник:
1 - Понедельник (2) пятой недели (5) Июня (June)
2 - Понедельник (2) последней недели (21) Июня (June) 
3 - Понедельник (2) четвертой недели (21 Июня (June) 

user posted image

Сегодня 23 Июня 2014 года. Понедельник - Пятая неделя. Запускаем запрос:
user posted image
И результат НОЛЬ - ничего не выводит

Меняем дату на 30-06-2014 (шестая неделя), снова запускаем запрос:
user posted image
результат так же ноль!!!

Меняем дату на 16-06-2014 (четветая неделя), запускаем запрос:
user posted image
Результат НОЛЬ.

В чем проблема? Где ошибки?

Все точно расписал?



PM MAIL WWW ICQ Skype   Вверх
McDoc
Дата 23.6.2014, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



Небольшое уточнение, которое ни где не прочитать:

- Любой месяц и отчет недель месяца начинается с понедельника
- Если 1-е число любого месяца выпадает на Воскресенье или Субботу эти дни относятся к неделе прошлого месяца

Блин, пока не столкнулся, нифига не знал!
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 23.6.2014, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(McDoc @  23.6.2014,  13:37 Найти цитируемый пост)
Так как WEEKDAY - понимает только цифры - http://dev.mysql.com/doc/refman/5.6/en/dat...unction_weekday - верно ли это?

Да, верно. Мы просто кодируем информацию тем способом, который считаем удобным. Причём в данном случае удобным не только нам (нам по большому счёту сиренево, числа там или слова), но и серверу (ему проще, быстрее и естественнее работать с целыми числами, чем со строками).

Цитата(McDoc @  23.6.2014,  13:37 Найти цитируемый пост)
Когда пользователь в Форме (форма на странице HTML и РНР) выбирает Неделя 1, 2, 3, 4, 5 или Last (для отправки данных в таблицу) -  у нас в таблицу идет аргумент 21. Верно?

Угу. Клиентская часть с этим вполне справится - заменой строки Last на число 21. Кстати, и с остальными значениями будет то же самое - на экране отображается строка "1", а серверу передаётся соответствующее этой строке число 1. Пусть они выглядят внешне одинаково, но тип у них разный.

Цитата(McDoc @  23.6.2014,  13:37 Найти цитируемый пост)
У нас имеется три записи на Понедельник:

Не-не-не... это беллетристика. Давай ставить ЗАДАЧУ. То есть формализовать весь этот словесный хлам и получать ТЗ. Типа:

Итак, имеется таблица (тут должен быть приведён соответствующий CREATE TABLE ...).
В ней имеются записи (а тут - соответствующий INSERT ... VALUES ...).
Имеется некая дата. Например, текущая. Или некая заданная.
Задача - вывести из таблицы те записи, которые соответствуют указанной (то есть сегодняшней или заданной) дате. Т.е. попадают в диапазон полей начало-конец, и соответствуют деформализованному номеру недели.

Добавь в это дело все (абсолютно все!) тонкости и условности, чтобы исключить ЛЮБЫЕ непонятности либо разночтения (включительно или невключительно заданы интервалы, как считать номер недели и пр.) - и тогда можно будет приступать к решению задачи.

Добавлено через 1 минуту и 8 секунд
Цитата(McDoc @  23.6.2014,  15:50 Найти цитируемый пост)
Если 1-е число любого месяца выпадает на Воскресенье или Субботу эти дни относятся к неделе прошлого месяца

А если, например, на среду, то что есть "первая неделя"?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
McDoc
Дата 24.6.2014, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



Возьму перерыв..... топчусь рядом....
Пока возьмусь за несколько другу работу. И по ней вопросы в другой теме....
PM MAIL WWW ICQ Skype   Вверх
McDoc
Дата 26.6.2014, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



Вместо того, что в ручную забивать данные в таблицу, решил отправить из через форму, так проще по ходу будет, что бы код сам послал аргумент, ну а после запрос из таблицы можно составить.

И так, есть форма

user posted image[/URL]

Все работает отлично. Кроме двух элементов.
Вначале о наболевшем.

Frequency - выбираем First - в талицу отпраляется 1, и так далее. Так как при запросе из БД weekday понимает только НОМЕР, а не слово - мне нужно как то послать аргумент Last. WEEKDAY идеально читает номера недель как 1, 2, ... 5. 
Если выбрать Every - я не еще не уверен, либо по умолчанию должно в таблице быть NULL либо пробовать как NULL слово отправить.

И так код:
Код

Friquency
            <select name="frequency">
            <?php
                $frequency = array(" ","First","Second","Third","Fourth","Last","Every");
                $frequ_val = array("","1","2","3","4","Last","Every");
                    for($fr=0; $fr<7; $fr++){
                    echo "<option value=\"".$frequ_val[$fr]."\">".$frequency[$fr]."</option>"; 
                }
            ?>

            </select>


и отправка в таблицу

Код

if($_POST['frequency']=="Last")
            {
                // вот тут проверка
            }
             elseif($_POST['frequency']=="Every")
            {
                // посылаем NULL или пустое не уверен... что нужно.
            }
                else
            {
                $peremennaja = $_POST['frequency'];
            }


и запрос отправки в таблицу:

Код

$sql = "INSERT INTO `task_db`.`tasks` (`id`, `description`, `start_date`, `start_time`, `exp_day`, `frequency`, `specific_day`, `day_of_week`, `month_of_year`, `code`)    
            VALUES (NULL, '$text_box', '$start_date', '$time_box', '$exp_date', $peremennaja, NULL, $day_week, '$month3', 'monthly');";
            


/Выбрал First - иденичка летит в талицу, а вот... Last and Every...  проблематичней.
PM MAIL WWW ICQ Skype   Вверх
McDoc
Дата 27.6.2014, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



По ходу тут нужно использовать временную метку... - http://www.php.net/manual/ru/function.strtotime.php - хотя до конца еще не уверен.
Есди ее использовать, то по идее мне как то надо собрать дату до кучи, из того что есть.

Меня интересует как пример - Последняя Пятница Января вне зависимости от года.
 
Но получается фигня какая то.
Если привязывать к конкретной дате - более понятно... Но к абстрактной, не выходит.

Как пример:

Код

<?php
echo strtotime("2014-06-27"), "\n"; //Today
echo strtotime("2014-06-28"), "\n\n"; //Tmr

echo strtotime("2014-06-30"), "\n\n"; //Last Mon June 2014
echo strtotime("Last Monday June 2014");
?>


Что выходит...
1403820000 1403906400 1404079200 1401055200 
Последние два значения должны быть одинаковыми...

Какой то тупиковый путь ((((
PM MAIL WWW ICQ Skype   Вверх
McDoc
Дата 30.6.2014, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



Решено!
Кому надо пользуейтесь:

Код

Friquency
            <select name="frequency">
            <?php
                $frequency = array("First","Second","Third","Fourth","Fifth","Last","Every");
                $frequ_val = array("1","2","3","4","5","6","7");
                    for($fr=0; $fr<7; $fr++){
                    echo "<option value=\"".$frequ_val[$fr]."\">".$frequency[$fr]."</option>"; 
                }
            ?>
            </select>


А вот запрос... Вот где фишка - а не в аргументе.

Код

SELECT  `description` AS  'Task', DATE_FORMAT( current_date,  '%d %b %y' ) AS  'Current date',  `start_time` AS  'Time'
FROM tasks
WHERE  `code` LIKE  'monthly'
AND  `start_time` > current_time
AND  `exp_day` >= current_date
AND  `day_of_week` = DAYOFWEEK( current_date ) 
AND  `month_of_year` = MONTHNAME( current_date ) 
AND 
(case 
 when `frequency` in (1,2,3,4,5) then `frequency` = WEEKDAY (current_date)
 when `frequency`=7 then true
 when `frequency`=6 then DAY(current_date)>DAY(date_add(current_date,interval 1 week))
 end)
ORDER BY  `start_time`



Akina, - умный(ая) простите не имею чести знать, но все таки до конца сам(а) не знал(а) ответа.
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 30.6.2014, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Радуйтесь, что tangir-у оказалось не лень разбираться в Вашем "потоке сознания".



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
McDoc
Дата 3.7.2014, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 23.11.2011
Где: Dublin

Репутация: нет
Всего: нет



Он единственный кому не надо было делать уточнения, и не требовал дополнений. 
Отлично и быстро направил.
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1158 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.