Как получить дату начала и дату окончания недели из MYSQL, когда доступен номер недели?

Функция week () MySql дает номер недели от 0 до 53.

У меня есть номер недели, и я хочу, чтобы "дата начала" и "дата окончания" недели были представлены номером недели. Как я могу это сделать?

Если нет возможности напрямую получить «дату начала» и «дату окончания» недели, как я могу указать «начальный день недели» и «конечный день недели» из номера недели? Я попытался получить первый день (понедельник) недели, используя следующий запрос: -

$currentWeek = 7;
for($w = 0; $w <= $currentWeek; $w++)
{
    $actualWeek = intval($w + 1);
    if($w < 10)
        $queryWeek = '0'.$actualWeek;
    else
        $queryWeek = $actualWeek;
    $thisYearWeek = date('Y').$queryWeek;
    $weekMondayQuery = $this->CustomerPayment->query("SELECT STR_TO_DATE('$thisYearWeek', '%X%V %W')");
}

1 января 2018 года был понедельник. В течение Первой недели, т.е. когда $thisYearWeek = '201801', я получаю дату понедельника как 2018-01-08 вместо 2018-01-01.


person Saswat    schedule 10.02.2018    source источник
comment
Попробуйте следующее: stackoverflow.com/questions/16590500 /   -  person Ahmad Rezk    schedule 10.02.2018


Ответы (2)


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

Предположим, что 2018-01-01 - это понедельник первой недели, а количество недель, которое вам нужно, равно $num_week:

SELECT '2018-01-01' + INTERVAL ($num_week-1)*7 DAY as start, 
       '2018-01-01' + INTERVAL $num_week*7-1 DAY as end;

Что на 7-ю неделю дает:

>>> SELECT '2018-01-01' + INTERVAL 42 DAY as start, 
           '2018-01-01' + INTERVAL 48 DAY as end;

start       end
2018-02-12  2018-02-18

РЕДАКТИРОВАТЬ: добавлено исправление, если первый день года не понедельник. Но ваша реализация будет зависеть от того, как вы считаете недели с помощью функции week():

>>> select '2016-01-01'+interval ($num_week-week('2016-01-01', 1))*7 - weekday('2016-01-01') day as start, 
           '2016-01-01'+interval ($num_week-week('2016-01-01', 1)+1)*7-1 - weekday('2016-01-01') day as end;

start       end
2016-02-15  2016-02-21

>>> select '2017-01-01'+interval ($num_week-week('2017-01-01', 1))*7 - weekday('2017-01-01') day as start, 
           '2017-01-01'+interval ($num_week-week('2017-01-01', 1)+1)*7-1 - weekday('2017-01-01') day as end;

start       end
2017-02-13  2017-02-19
person akarilimano    schedule 10.02.2018

Начиная с номера недели, мы можем сделать следующее (большинство переменных должно быть интуитивно понятным, но sow - это начало недели):

SET @weeknum=42;
SET @week=DATE_ADD('2018-01-01', INTERVAL @weeknum WEEK);
SET @dow=DAYOFWEEK(@week)-1;
SET @sow=DATE_SUB(@week, INTERVAL @dow DAY);
SELECT @week, @dow, @sow;
SELECT @sow AS startDay, DATE_ADD(@sow, INTERVAL +6 DAY) AS endDay;

Это говорит нам о том, что 42-я неделя в 2018 году начинается 21 октября 2018 года и заканчивается 27 октября 2018 года ... помните, что недели в году имеют нулевую индексацию с использованием этого метода. Дни недели, возвращаемые MySQL, индексируются 1, отсюда вычитание в присваивании @dow.


Эквивалент этого в PHP несколько проще:

date('Y-m-d', strtotime('sunday last week '.date('Y-m-d', strtotime('2018-01-01 +42 weeks'))))

который возвращает: 2018-10-21 ... используя "last week", потому что он считает понедельник первым днем ​​недели.

person sorak    schedule 10.02.2018