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

Поиск:

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


Новичок



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

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



Ребята, есть небольшая замарочка.

Теория:
- Каждый месяц содержит неколько одинаковых дней недель. 4 Понедельника, 4 Вторника ......и даже бывают варианты что 5 Пятниц.

Соответственно разбиваю логически на:
Первый (First)
Второй (Second)
Третий (Third)
Четвертый (Fourth)
Последний (Last)
Понятно, что Четвертый может быть и Последним. Не вижу логческого конфликта.

Если делать стандартный запрос:
Код

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 ) 
ORDER BY  `start_time` 


То проблем ни каких не возникает.

А вот проверить это Третья ли среда месяца, или Четвертый четверг, или последняя пятница месяца не получается.
Подскажите как проверить какой это по счету день недели, если колонка в таблице имеет название frequency и конечно все периуды имеют названия First, Second, Third, Fourth, Last.

Это сообщение отредактировал(а) McDoc - 18.6.2014, 19:20
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 19.6.2014, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(McDoc @  18.6.2014,  20:19 Найти цитируемый пост)
 как проверить какой это по счету день недели

DAYOFWEEK(date)
WEEKDAY(date) 



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

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


Новичок



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

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



Цитата(Akina @ 19.6.2014,  07:54)
Цитата(McDoc @  18.6.2014,  20:19 Найти цитируемый пост)
 как проверить какой это по счету день недели

DAYOFWEEK(date)
WEEKDAY(date)

Спасибо, но примерно эти же команды я и расматривал.
Но к сожалению не могу найти, как эти команды обчитывают (расчитывают).

Плюс, программа обчитывает Слова как в месяце к примеру, или мне нужно ставить индексы (1, 2, 3 ... 5). Или как?

К примеру если в месяце 4 пятницы, и я оставляю метку Червертая, она же может быть и последняя. Но как нить она может выпасть и на Пятой пятницей.

Как работает алгоритм? Я хочу понять при забивке занных в таблицу. 

Кто знает, поясните.

Это сообщение отредактировал(а) McDoc - 19.6.2014, 11:13
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 19.6.2014, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(McDoc @  19.6.2014,  12:08 Найти цитируемый пост)
 Я хочу понять 

Указанные функции позволят тебе получить день недели.
Что же до номера недели в месяце... смотри. Если неделя начинается понедельником, достаточно тупо поделить номер дня на 7 (целочисельно, есссно), и номер недели у нас в кармане. А если не понедельником? допустим, вторником... давай добавим в первую неделю недостающий день - тогда можно спосойно делить на 7. А если среда? добавим два дня... Четверг? три... А сколько добавлять в общем случае? а надо просто узнать номер дня в неделе для первого дня месяца!

Конечный алгоритм получается такой. Берём нужную дату. Отнимаем от неё (date_sub) столько дней, каков номер дня (day) этой даты - получаем день перед первым числом этого месяца. Спрашиваем, а какой это по номеру день недели (dayofweek). Полученное число добавляем (date_add) к номеру дня (day) нужной даты. И делим полученное на 7. Всё, у нас в руках номер недели. Возможно, там ещё надо будет прибавить или отнять единицу-другую - но думать лениво. Сам проверишь и определишь, надо или нет, а если надо, то что именно.


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

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


Новичок



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

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



Вчера убил подня на решение проблемы, но она пока не решена.

Вопрос № 1, как переодичность декларировать в таблице?

First или 1
Second или 2
..... или 3
..... или 4
А как же декларировать Last ???
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 20.6.2014, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(McDoc @  20.6.2014,  11:56 Найти цитируемый пост)
как переодичность декларировать в таблице?

Никак. Это не данные, а их интертрепация на клиенте.


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

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


Новичок



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

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



Смотри, вот пример:

user posted image

Вот мы отмечаем Последний понедельник первого месяца. Но столь важно, номер месяца. Важно Последний... Понедельник.

Он же какие то данные отправляет в таблицу!

Мне нужно создать тоже подобное. Что бы потом изтаблицы выводить на экран.

Добавлено через 11 минут и 23 секунды
В этом году в частности, последний понедельник - Он является началом шестой недели месяца.
Не важно, что в этой неделе месяца один день. Но шестая!

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


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


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

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



Цитата(McDoc @  20.6.2014,  12:20 Найти цитируемый пост)
Вот мы отмечаем Последний понедельник первого месяца. Но столь важно, номер месяца. Важно Последний... Понедельник.Он же какие то данные отправляет в таблицу!

Ну да, отправляет... вот прямо так и отправляет - код дня (напр., 1 == Monday) и код недели (напр. 21 == Last)... и что? коды назначай сам. И интерпретируй их обратно тоже сам.

В частности, чтобы проверить, что некая дата является последним понедельником месяца, нужно а) убедиться, что это понедельник, используя соотв. функцию; б) убедиться, что он последний - добавить неделю и сравнить месяц, он должен измениться... по результатам проверки вернёшь True либо False.


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

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


Новичок



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

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



Не то!
День недели норма. DayOfWeek - он работает отлично.

Я наверное не могу толкм объяснить, попробую картинками.

Вот шапка таблицы:

user posted image

Вот две тестовые записи, в одно номер недели в другом слово.

user posted image

Отлично, есть две записи.

далее простенький тестовый запрос:

Код

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` 


Получаем выборку, в ней одна запись. Значит Использование номера а не слова правильно!
Неделя 4-ре сейчас, и в будущем если нам нужно вызвать неделю 4-ре мы забиваем в таблицу номер 4. Супер!

user posted image

Эта задача с номером недели решена отлично!
Теперь представим, у нас Форма отправки в таблицу:

С какого деня стартует - 21-06-2014 
Что произойдет - Совещание у шефа
Время - 10-00
День недели - Пятница (у нас в таблицен будет аргумент 6)
Чястота - Послденяя
Месяц - Август - он идет как Август, запрос как MONTHNAME

Все аргументы понятно как улетят в таблицу, а что должно отправиться в таблицу как Последняя?

Это сообщение отредактировал(а) McDoc - 20.6.2014, 12:24
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 20.6.2014, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(McDoc @  20.6.2014,  13:22 Найти цитируемый пост)
что должно отправиться в таблицу как Последняя?

Код, который соответствует слову (термину, понятию) "Последняя". Этот код будет скормлен пользовательской функции в секции WHERE. И если указанная (или, как я понял, выбранная из поля записи) дата пройдёт проверку в функции, та вернёт True, и запись попадёт в отбор, иначе нет. Вот и всё.


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

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


Новичок



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

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



Отлично.
Помоги сделать проверку вставки в таблицу:

Код

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 ,  'Monthly
Every Last Friday every June at 12:00',  '2014-06-20',  '12:00:00',  '2030-12-31',  'Last', NULL ,  '6',  'June',  'monthly'
);


Вот вместо Last написать функцию проверки.
Я нифига не могу понять..... 

Так как это все будет вставляться через РНР старницу.

Код

$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, \'Monthly\n"
    . "Every Last Friday every June at 12:00\', \'2014-06-20\', \'12:00:00\', \'2030-12-31\', \'Last\', NULL, \'6\', \'June\', \'monthly\');";


Это сообщение отредактировал(а) McDoc - 20.6.2014, 12:45
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 20.6.2014, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(McDoc @  20.6.2014,  13:40 Найти цитируемый пост)
проверку вставки в таблицу

А тебе точно надо "проверить, что выполнена вставка в таблицу"? тогда просто вызови какой-нить affected_rows()...


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

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


Новичок



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

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



Мне без разницы что улетит в таблицу. 
Сейчас пытаюсь найти код пример "проверки последней недели в месяце".

Как я понял из твоего поста там будет типа 'Last' = dnso >hvbsk - 7 or hbvsi <>0 
(и вот это пока бредовое выражение полетит в таблицу, как я понял - если это верно)
PM MAIL WWW ICQ Skype   Вверх
Akina
Дата 20.6.2014, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(McDoc @  20.6.2014,  14:00 Найти цитируемый пост)
пытаюсь найти код пример "проверки последней недели в месяце".

Код

where month(mydate) != month(mydate + interval 1 week)


Ну или в более общем случае
Код

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


Это сообщение отредактировал(а) Akina - 20.6.2014, 13:26


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

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


Новичок



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

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



Спасибо.

Мне кажется очень близко, но все равно, где то ошибка.

1 - Сменил Дату на компе, на 27-июня - Последняя пятница этого месяца

user posted image

Обновил одну из записей, добавл вместо номера недели код:
Код

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


Имею:
user posted image

4 записи:
1 - с Fourth
2 - c 4
3 - c Last
4 - c кодом

Делаю запрос:
Код

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` 


user posted image[/URL] 

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


 




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


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

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