Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Определить даты понедельников


Автор: BuShaRt 27.2.2012, 17:30
Задача: есть любая дата. Нужно определить понедельник недели, которой пренадлежит дата.

На пример:
1. 22.02.2012 - Понедельником этой недели будет 20.02.2012
2. 9.02.2012 - Понедельником этой недели будет 6.02.2012

Реально ли это сделать на чистом SQL?

Автор: Fortop 27.2.2012, 21:31
Цитата(BuShaRt @  27.2.2012,  17:30 Найти цитируемый пост)
Реально ли это сделать на чистом SQL? 

Реально

Автор: BuShaRt 29.2.2012, 14:39
Цитата(Fortop @  27.2.2012,  21:31 Найти цитируемый пост)
Реально


Как? Без сложный вложений?

Автор: Fortop 29.2.2012, 17:55
Код

CASE WHEN условие THEN чего-то ELSE чего-то


Конструкция может быть вложенной. т.е. в худшем из вариантов нужен ###код из 7 CASE

Но можно поискать функции даты smile Там что-то есть.

Автор: Akina 29.2.2012, 22:56
Код

DATE_SUB(`date`, INTERVAL DAYOFWEEK(`date`)-2 DAYS)

Автор: BuShaRt 3.5.2012, 14:50
Fortop, 
Это попахивает быдлокодом...

Akina, 
Спасибо! Отличное решение. Только в оригенале выдает ошибку, но легко можно поправить:
Код

DATE_SUB(`date`, INTERVAL (DAYOFWEEK(`date`) - 2) DAY)

Автор: BuShaRt 9.5.2012, 10:40
Очень интересно было бы услышать мнение людей, ставящих минусы моему посту. Уверен, что они могут оспорить мои слова какой-то очень весомой информацией.

Автор: Fortop 10.5.2012, 19:26
Цитата(BuShaRt @  9.5.2012,  10:40 Найти цитируемый пост)
Очень интересно было бы услышать мнение людей, ставящих минусы моему посту. Уверен, что они могут оспорить мои слова какой-то очень весомой информацией. 


Лично мой минус за вот это
Цитата(BuShaRt @  3.5.2012,  14:50 Найти цитируемый пост)
Это попахивает быдлокодом...


при том, что вам написали о "неоптимальности" предложенного варианта и где смотреть правильное решение smile 
Цитата(Fortop @  29.2.2012,  17:55 Найти цитируемый пост)
Конструкция может быть вложенной. т.е. в худшем из вариантов нужен ###код из 7 CASE

Но можно поискать функции даты  Там что-то есть. 


Это я к тому, что говорить о ###коде стоит лишь тогда, когда ты сам знаешь лучшее решение smile

Автор: BuShaRt 15.5.2012, 12:21
Fortop, 
Предложенный Вами код очевиден и в представление не нуждается. Я бы даже сказал, что мысль о реальном использование таких конструкций говорит о непрофессиональности. Очень печально, что есть люди для которых это не очевидно, тем более, что я Выше попросил не приводить таких примеров:
Цитата

Как? Без сложный вложений? 


Цитата(Fortop @  10.5.2012,  19:26 Найти цитируемый пост)
Это я к тому, что говорить о ###коде стоит лишь тогда, когда ты сам знаешь лучшее решение 

Лучшее решение (именно то, что я ожидал услышать) привел, уважаемый Akina, за что ему большое спасибо. 

З.ы.: вообще, очень не красиво из-за личных переживаний минусовать посты. Если Вы еще не забыли, то это форум для общения специалистов в вопросах связанных с программированием и по сути поводом для минуса может быть только не согласие с техническими деталями, а не личные обиды. 

Автор: igorold 15.5.2012, 13:11
... при чем тут, интересно, личные обиды?

Тебе помогают, кто как может и не надо "плевать в дающую руку" ... 

Автор: BuShaRt 15.5.2012, 15:29
igorold, 
Есть в Ваших словах правда, но в народе такая помощь называется "медвежье услугой". Вопрос марали в данном случае заслуживает отдельного топика на форуме философов, но мы находимся на форуме программистов, где сообщение о том, что код некорректный (кратко "быдлокод") не является "плевком в душу", а констатирует тот факт, что код непрофессионален. Как воспринимать эту информацию - дело каждого. Я, на пример, искренне благодарен людям, которые на заре моей карьеры программиста меня тыкали носом в мой кривой код и говорили, что это немыслимый ужас необходимо переписывать.

Автор: Fortop 16.5.2012, 00:51
Цитата(BuShaRt @  15.5.2012,  15:29 Найти цитируемый пост)
Есть в Ваших словах правда, но в народе такая помощь называется "медвежье услугой". 

Медвежья услуга это то, что сделал Акина.
Поскольку вы ни на грамм не приблизились к пониманию и умению работы с мануалами и поисковыми системами. Вам тупо разжевали и засунули в рот отрыжку.

Оно конечно удобно... для вас.... Но вот работать с такими специалистами как вы - просто доставляет.
Полсотни вопросов "как сделать", каждый из которых гуглится буквально за 2-3 минуты.

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

Цитата(BuShaRt @  15.5.2012,  15:29 Найти цитируемый пост)
 на заре моей карьеры программиста

Учитывая тематику топика (http://forum.vingrad.ru/topic-349316.html), ваша заря еще не закончилась.

Автор: igorold 16.5.2012, 07:08
Цитата(BuShaRt @  15.5.2012,  15:29 Найти цитируемый пост)
Есть в Ваших словах правда, но в народе такая помощь называется "медвежье услугой". Вопрос марали в данном случае заслуживает отдельного топика на форуме философов, но мы находимся на форуме программистов, где сообщение о том, что код некорректный (кратко "быдлокод") не является "плевком в душу", а констатирует тот факт, что код непрофессионален. Как воспринимать эту информацию - дело каждого. Я, на пример, искренне благодарен людям, которые на заре моей карьеры программиста меня тыкали носом в мой кривой код и говорили, что это немыслимый ужас необходимо переписывать. 



... в том то и дело, что вопрос морали - это назвать чей-то код именно некорректным, а не "быдлокодом" ... мораль - категория этическая, а не филосовская ... 

Выше вам было предложено направление, а не конкретный код ... а непрофессионализм просматривается, как раз у вас ... 

И очень хочется, чтобы подобные программисты не марали своей писаниной программистский форум, например как в данной теме.

Автор: Akina 16.5.2012, 07:53
Цитата(igorold @  16.5.2012,  08:08 Найти цитируемый пост)
Выше вам было предложено направление, 

Уберите мой пост. После чего попробуйте найти направление, которое дали. Нашли? теперь оцените профессионализм этого направления. Только честно.


Автор: igorold 16.5.2012, 08:22
Akina, понятно, что ваш совет профессиональнее, учитывая ваш богатый опыт.

Если указано направление и можно с его помощью решить проблему - это плохо?

На то и форум, чтобы предлагать разные решения ... не у всех большой опыт, так значит пусть не дают советы?
Не боитесь, что один останетесь в ветке?

Автор: Zloxa 16.5.2012, 09:39
Цитата(igorold @  16.5.2012,  09:22 Найти цитируемый пост)
 не у всех большой опыт, так значит пусть не дают советы?

igorold, мне не понятно, к благодарности какому совету ты призываешь
Не этого ли:
Цитата(Fortop @  29.2.2012,  18:55 Найти цитируемый пост)
 можно поискать функции даты  Там что-то есть. 


Впрочем, я согласен с тем, что BuShaRt очень погорячился давать оценки способам решений. Это было грубоватенко.

Автор: Akina 16.5.2012, 10:46
Цитата(igorold @  16.5.2012,  09:22 Найти цитируемый пост)
Если указано направление и можно с его помощью решить проблему - это плохо?

Если с его помощью можно решить проблему, при этом любому понятно, что будет заведомо написан... выражусь политкорректно - монстрообразный нечитаемый медленно работающий неоптимальный код, который приведёт в ужас и начинающего, и специалиста,- это хорошо или плохо? 


Автор: Zloxa 16.5.2012, 11:02
Цитата(Akina @  16.5.2012,  11:46 Найти цитируемый пост)
монстрообразный 

Akina, да ладно тебе. Выражение из семи when'ов кейса на монстрообразность нуникак не тянет. А лаконичность не всегда признак читаемости. Иные лаконичные выражения мозг взрывается читать.

К слову заметить, если бы ТС хотяб попытался реализовать им желаемое грубым кейсом, думаю где-то на среде он уловил бы закономерность и сам пришел бы к более лаконичному решению.

Автор: igorold 16.5.2012, 12:00
Цитата(Zloxa @  16.5.2012,  09:39 Найти цитируемый пост)
igorold, мне не понятно, к благодарности какому совету ты призываешь


Я не призываю к благодарности ... я предлагаю ярлычки не вешать ...  smile 

Автор: BuShaRt 16.5.2012, 12:03
Цитата(Zloxa @  16.5.2012,  11:02 Найти цитируемый пост)
К слову заметить, если бы ТС хотяб попытался реализовать им желаемое грубым кейсом, думаю где-то на среде он уловил бы закономерность и сам пришел бы к более лаконичному решению.

Решительно не понимаю, почему в рамках этого обсуждения мой уровень знаний был воспринят как стремящийся к нулю =) 
Я изначально знал, что существует простои и лаконичное решение базирующиеся на MySQL функциях работы с датами, но в меру того, что у меня не набита рука в работе с этими функциями, я решил посоветовать с более опытными коллегами. Честно скажу, что не потому, что не в состояние разобраться, а в целях экономии времени на штудировани мана и продумывания решения для свидения нужных функций воедино. Как только Akina привел свой пример я заручившись поддержкой мануала за пару минут разобрался в нем и дополнил его недостающей логикой. Поэтому утверждая, что получив ответ  Akina я упустил какой-то важный момент в обучение, Вы явно ошибаетесь.

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

Автор: igorold 16.5.2012, 12:03
Цитата(Akina @  16.5.2012,  10:46 Найти цитируемый пост)
Если с его помощью можно решить проблему, при этом любому понятно, что будет заведомо написан... выражусь политкорректно - монстрообразный нечитаемый медленно работающий неоптимальный код, который приведёт в ужас и начинающего, и специалиста,- это хорошо или плохо? 


Если стоит принципиальный вопрос - решить проблему и она будет решена неоптимальным кодом, то это будет поводом его оптимизировать ... только и всего, но при этом программа уже будет давать результат ... 

Автор: Zloxa 16.5.2012, 12:47
Цитата(BuShaRt @  16.5.2012,  13:03 Найти цитируемый пост)
Поэтому утверждая, что получив ответ  Akina я упустил какой-то важный момент в обучение, Вы явно ошибаетесь.

Где я что-то  подобное утверждал?  smile 
Я лишь заметил, что прийти к этому решению не сложно, стоит лишь начать идти, пусть и изначально не в ту сторону.

Цитата(BuShaRt @  16.5.2012,  13:03 Найти цитируемый пост)
Уверен, что ответ Fortop не только не приблизил меня к ответу, но еще и запутал новичков, которые в следующий раз вместо того, чтоб обратиться к функциям работы с датой будут громоздить сложную логику запроса.  

Для того чтобы громоздить сложную логику, все равно придется обратиться к функциям работы с датами. Никого Fortop не запутал. Его ответ был просто ни о чем. И снисходительный тон, им выбранный, да - был не совсем уместен. Ровно как и не совсем уместной была ваша реакция на это.

Автор: igorold 17.5.2012, 14:27
Для воскресений этот алгоритм не работает:

Код

+------------------------------------------------------------------+
| DATE_SUB('2012-05-20', INTERVAL DAYOFWEEK('2012-05-20') - 2 DAY) |
+------------------------------------------------------------------+
| 2012-05-21                                                       |
+------------------------------------------------------------------+



выдает следующую дату.

Добавлено @ 14:34
Я так понимаю нужна другая функция:

Код

mysql> select DATE_SUB('2012-05-11', INTERVAL WEEKDAY('2012-05-11') DAY);
+------------------------------------------------------------+
| DATE_SUB('2012-05-11', INTERVAL WEEKDAY('2012-05-11') DAY) |
+------------------------------------------------------------+
| 2012-05-07                                                 |
+------------------------------------------------------------+

+------------------------------------------------------------+
| DATE_SUB('2012-05-13', INTERVAL WEEKDAY('2012-05-13') DAY) |
+------------------------------------------------------------+
| 2012-05-07                                                 |
+------------------------------------------------------------+



Добавлено @ 14:35
BuShaRt, ты ведь не будешь говорить, что Akina тебя запутал?

 

Автор: BuShaRt 18.5.2012, 17:25
igorold, 
=) Хм... Да, слона то я и не заметил... 
Огромное спасибо!

Автор: Fortop 19.5.2012, 19:42
Цитата(Akina @  16.5.2012,  07:53 Найти цитируемый пост)
После чего попробуйте найти направление, которое дали

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

Это сложно? smile

Добавлено через 6 минут и 16 секунд
Цитата(Zloxa @  16.5.2012,  12:47 Найти цитируемый пост)
Где я что-то  подобное утверждал?   

Это утверждал я smile

Автор: Akina 20.5.2012, 22:06
Цитата(igorold @  17.5.2012,  15:27 Найти цитируемый пост)
Akina тебя запутал

 smile чем именно? ты правда думаешь, что если бы он начал писАть конструкцию из кучи вложенных кейсов, было бы лучше?

Насчёт неверного выбора функции, дающего неуниверсальное решение - полностью согласен. Но осмелюсь сослаться на твои собственные слова: 
Цитата(igorold @  16.5.2012,  13:03 Найти цитируемый пост)
Если стоит принципиальный вопрос - решить проблему и она будет решена неоптимальным кодом, то это будет поводом его оптимизировать ... только и всего, но при этом программа уже будет давать результат ...  

Мой код сразу после устранения синтаксических недочётов начал давать правильный результат в рамках поставленной задачи. И лишь расширение области применения позволило выявить его недостаток и указать на необходимость его универсализации путём замены используемой функции.

Так где я его запутал, а?

Автор: Fortop 20.5.2012, 22:15
Цитата(Akina @  20.5.2012,  22:06 Найти цитируемый пост)
Но осмелюсь сослаться на твои собственные слова:

Тебе на это ссылаться нельзя  smile 
Просто потому что ты решил с  некоторых пор стать адептом максимальной корректности решения.  smile 
Так что оправдывайся теперь.

Автор: igorold 21.5.2012, 06:13
Цитата(Akina @  20.5.2012,  22:06 Найти цитируемый пост)
Цитата(igorold @  17.5.2012,  15:27 Найти цитируемый пост)
Akina тебя запутал

 smile чем именно? ты правда думаешь, что если бы он начал писАть конструкцию из кучи вложенных кейсов, было бы лучше?


Akina, зачем же вы выдираете слова из контекста?
Моя фраза была такая:

Код

BuShaRt, ты ведь не будешь говорить, что Akina тебя запутал?


Причем открою большой секрет - в этой фразе содержится юмор ... легкий сарказм ... 

Цитата(Akina @  20.5.2012,  22:06 Найти цитируемый пост)
Цитата(igorold @  17.5.2012,  15:27 Найти цитируемый пост)
Насчёт неверного выбора функции, дающего неуниверсальное решение - полностью согласен. Но осмелюсь сослаться на твои собственные слова: 
Цитата(igorold @  16.5.2012,  13:03 Найти цитируемый пост)
Если стоит принципиальный вопрос - решить проблему и она будет решена неоптимальным кодом, то это будет поводом его оптимизировать ... только и всего, но при этом программа уже будет давать результат ...  

Мой код сразу после устранения синтаксических недочётов начал давать правильный результат в рамках поставленной задачи. И лишь расширение области применения позволило выявить его недостаток и указать на необходимость его универсализации путём замены используемой функции.

Так где я его запутал, а?


Насчет остального вы лукавите. Ваш запрос дает правильный результат в рамках поставленой задачи, НО только для 6-ти случаев из 7.
И мое тестирование выявило ошибку для 1 случая из 7, что означает, что все-таки полностью проблема не была решена.
Если вы это называете недостатком, ну ладно ...  smile 

И к чему эти длинные разборки? был вопрос, нашли решение ... для этого и существует форум ... всем спасибо, все свободны ...  smile 

Автор: Akina 21.5.2012, 08:00
Цитата(igorold @  21.5.2012,  07:13 Найти цитируемый пост)
Насчет остального вы лукавите. Ваш запрос дает правильный результат в рамках поставленой задачи, НО только для 6-ти случаев из 7.

Для 100 случаев из ста. Понедельник ВСЕГДА определяется правильно - а именно так была поставлена задача.
Её расширение на любой день недели - это вовсе не топикстартером инициировано. Это - Ваше расширение. И с ним получается совсем иная задача. Тыкать мне то, что решение для одной задачи не подходит для другой - мне кажется как минимум некорректным.

Цитата(igorold @  21.5.2012,  07:13 Найти цитируемый пост)
Причем открою большой секрет - в этой фразе содержится юмор ... легкий сарказм ... 

Угу. Из неё даже невозможно понять, отрицающий это вопрос или утверждающий. 

Цитата(Fortop @  20.5.2012,  23:15 Найти цитируемый пост)
Тебе на это ссылаться нельзя   

Это я как-нибудь сам решу, без советов со стороны.

Цитата(Fortop @  20.5.2012,  23:15 Найти цитируемый пост)
ты решил с  некоторых пор стать адептом максимальной корректности решения.

В рамках поставленной задачи - всегда. И мне никогда не придёт в голову посоветовать сострогать какое-нить многоэтажное безобразие, если есть хоть какой-то шанс сделать это иным способом. В отличие от [slack skipped].

Автор: igorold 21.5.2012, 08:34
Akina, в таком случае вы неправильно поняли вопрос топикстартера.

Он просил определить дату понедельника для любой даты недели, в который входит введенная дата.

Согласен, что понедельник определяется ВСЕГДА, но для воскресений он уже относился к следующей неделе, что противоречит заданной проблеме ... 
 
Мне очень понравилось ваше решение и я даже поизучал его, чтобы понять как это работает ... извините, что нашел ошибку ... с кем не бывает ... 


Автор: Zloxa 21.5.2012, 08:41
Цитата(igorold @  21.5.2012,  07:13 Найти цитируемый пост)
 всем спасибо, все свободны ...   

А как же - поговорить © smile

Добавлено через 1 минуту и 46 секунд
Цитата(Fortop @  19.5.2012,  20:42 Найти цитируемый пост)
Это утверждал я 

А реплика была адресована мне.
На то я и пытался указать, задавая этот вопрос. smile 

Автор: Akina 21.5.2012, 09:49
Цитата(igorold @  21.5.2012,  09:34 Найти цитируемый пост)
извините, что нашел ошибку ... с кем не бывает ... 

Это как раз очень хорошо - в результате получено универсальное решение. Но основание для его поиска - моё предложение, а не предложение наплодить кучу вложенных кейсов. Всё-таки...

Автор: igorold 21.5.2012, 12:37
Цитата(Akina @  21.5.2012,  09:49 Найти цитируемый пост)
Это как раз очень хорошо - в результате получено универсальное решение. Но основание для его поиска - моё предложение, а не предложение наплодить кучу вложенных кейсов. Всё-таки...


... ну да ... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)