Наиболее популярный до сих пор ответ на этой доске выглядит следующим образом:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
Для начала это хороший ответ, но в некоторых днях он не работает, когда вы начинаетеиспользуйте его в сочетании с функцией week (), если только вы не добавите дополнительную логику.
Вот длинная, грязная версия того же самого, но, кажется, работает во все дни (кстати, текущая датавстроен в этот ответ):
SELECT STR_TO_DATE(
(IF( CAST(WEEK(NOW(),0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR(NOW()) AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR(NOW()) AS CHAR),
IF( CAST(WEEK(NOW(),0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK(NOW(),0) AS CHAR),
' Sunday')))),
'%X%V %W');
Этот беспорядок решает проблемы, которые возникают, когда год переходит в определенные дни недели.Например, 2011 год начался в субботу, поэтому воскресенье, которое начало неделю, было в предыдущем году.Вот выборка с жестко закодированными примерами:
SELECT STR_TO_DATE(
(IF( CAST(WEEK('2011-01-01',0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR('2011-01-01') AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR('2011-01-01') AS CHAR),
IF( CAST(WEEK('2011-01-01',0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK('2011-01-01',0) AS CHAR),
' Sunday')))),
'%X%V %W');
YEILDS >> '2010-12-26'
SELECT STR_TO_DATE(
(IF( CAST(WEEK('2011-01-02',0) AS UNSIGNED) = 0,
(CONCAT(
CAST((CAST(YEAR('2011-01-02') AS UNSIGNED) - 1) AS CHAR),
'52 Sunday')),
(CONCAT(
CAST(YEAR('2011-01-02') AS CHAR),
IF( CAST(WEEK('2011-01-02',0) AS UNSIGNED) < 10,'0','' ),
CAST(WEEK('2011-01-02',0) AS CHAR),
' Sunday')))),
'%X%V %W');
YEILDS >> '2011-01-02'
Все, что сказал, мне нравится другой ответ asnwer, который выглядит следующим образом
SELECT
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd;
Этот метод, кажется, работает так же хорошо на всех датах без беспорядка!