Функция 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.
Как насчет добавления дней к первому понедельнику в году?
Если предположить, 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
Начиная с номера недели, мы можем сделать следующее (большинство переменных должно быть интуитивно понятным, но 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 года начинается 2018-10-21 и заканчивается 2018-10-27 … помните, что недели с нулевым индексированием с использованием этой техники. Дни недели, возвращаемые 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
… используя «последнюю неделю», потому что он считает понедельник первым днем недели.