Получение первого дня недели в MySql с использованием Week No - PullRequest
31 голосов
/ 23 июля 2010

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

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

Ответы [ 8 ]

48 голосов
/ 16 мая 2012

Это точный способ получения первого дня недели и последнего дня недели на основе текущей даты:

adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate()) DAY) WeekStart,
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate()) DAY) WeekEnd
43 голосов
/ 23 июля 2010

Вы можете использовать:

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.

4 голосов
/ 06 августа 2012

Наиболее популярный до сих пор ответ на этой доске выглядит следующим образом:

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;

Этот метод, кажется, работает так же хорошо на всех датах без беспорядка!

3 голосов
/ 15 февраля 2016

Это может быть самый простой и динамичный способ для этого. Используйте следующий код.

SELECT STR_TO_DATE( concat( concat( date_format( CURDATE( ) , '%Y' ) , WEEKOFYEAR( CURDATE( ) ) ) , ' Monday' ) , '%X%V %W' );
2 голосов
/ 12 февраля 2013

Если у вас выходной - воскресенье, а выходной - суббота, используйте этот код:

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.

0 голосов
/ 04 января 2016

Дополнение к ответу dcp:

SELECT STR_TO_DATE('201553 Monday', '%x%v %W')

Даст вам понедельник, когда ваше начало недели - понедельник.Спецификаторы формата просто должны быть написаны маленькими.Математика не нужна.

0 голосов
/ 13 марта 2013
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';
0 голосов
/ 23 июля 2010

Не проверено (у меня нет MySQL под рукой):

date_add(
   date_sub(curdate(), interval weekday(curdate()) day),
   interval ((NUM-weekofyear(curdate()))*7) day)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...