Подтвердить что ты не робот

Получение первого дня недели в MySql с использованием Week No

Как мне получить первый день недели, номер недели которой доступен?

Например, когда я пишу этот пост, мы находимся в WEEK 29. Я хотел бы написать запрос MySQL, который вернет воскресенье 18 июля, используя этот WEEKNO 29 как единственный доступный параметр.

4b9b3361

Ответ 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')

Вы получите понедельника, когда начнется неделя в понедельник. Спецификаторы формата должны быть написаны небольшими. Нет необходимости в математике.