Получение первого дня недели в MySql с использованием Week No
Как мне получить первый день недели, номер недели которой доступен?
Например, когда я пишу этот пост, мы находимся в WEEK 29. Я хотел бы написать запрос MySQL, который вернет воскресенье 18 июля, используя этот WEEKNO 29 как единственный доступный параметр.
Ответы
Ответ 1
Вы можете использовать:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
Это даст вам дату понедельника 3-й недели 2010 года, которая будет 2010-01-18.
Другой пример:
SELECT STR_TO_DATE('201052 Sunday', '%X%V %W');
Дала бы вам воскресную дату недели 52 из 2010 года, которая будет 2010-12-26.
И, наконец, используя ваш оригинальный пример:
SELECT STR_TO_DATE('201029 Sunday', '%X%V %W');
Это дает 2010-07-18.
Ответ 2
Это точный способ получить первый день недели и последний день недели на основе текущей даты:
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd
Ответ 3
Ответ, наиболее понравившийся до сих пор на этой доске, выглядит следующим образом:
SELECT STR_TO_DATE('201003 Monday', '%X%V %W');
Это хороший ответ для начала, но он ломается в некоторые дни, когда вы начинаете использовать его в сочетании с функцией week(), если не добавить дополнительную логику.
Вот длинная, грязная версия того же самого, но которая, кажется, работает на все дни (BTW текущая дата встроена в этот asnwer):
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'
Все, что было сказано, мне нравится, что другой опубликованный annwer выглядит так:
SELECT
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd;
Этот метод, похоже, работает так же хорошо на всех датах без беспорядка!
Ответ 4
Это может быть самый простой и динамичный способ для него. Используйте следующий код.
SELECT STR_TO_DATE( concat( concat( date_format( CURDATE( ) , '%Y' ) , WEEKOFYEAR( CURDATE( ) ) ) , ' Monday' ) , '%X%V %W' );
Ответ 5
Если ваш недельный старт - воскресенье и выходные - суббота, используйте этот:
SELECT
DATE_ADD(CURDATE(), INTERVAL (MOD(DAYOFWEEK(CURDATE())-1, 7)*-1) DAY) AS week_start,
DATE_ADD(CURDATE(), INTERVAL ((MOD(DAYOFWEEK(CURDATE())-1, 7)*-1)+6) DAY) AS week_end
Протестировано на MySQL.
Ответ 6
Untested (у меня нет MySQL под рукой):
date_add(
date_sub(curdate(), interval weekday(curdate()) day),
interval ((NUM-weekofyear(curdate()))*7) day)
Ответ 7
SELECT CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),2),'-',
MID(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),6,2),'-',
LEFT(STR_TO_DATE(CONCAT(YEARWEEK(NOW()),'Monday'), '%X%V %W'),4)) AS 'Lundi',
CONCAT(RIGHT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),2),'-',
MID(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),6,2),'-',
LEFT(STR_TO_DATE(CONCAT(YEAR(NOW()), week(now(),3),'Sunday'), '%X%V %W'),4)) AS 'Dimanche';
Ответ 8
Добавление ответа dcp:
SELECT STR_TO_DATE('201553 Monday', '%x%v %W')
Вы получите понедельника, когда начнется неделя в понедельник. Спецификаторы формата должны быть написаны небольшими. Нет необходимости в математике.