Модераторы: 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   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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