Конвертировать год, неделю в дату на основе первого дня года в mySQL - PullRequest
0 голосов
/ 27 июня 2018

У меня есть сумма всех продаж за неделю в одном объекте, и объект должен отображаться в диаграммах, и у всех графиков должна быть дата по оси x, поэтому Здесь я рассчитываю дату от года + недели на основе понедельника

SELECT STR_TO_DATE(CONCAT('20131',' Monday'), '%X%V %W');

Я хочу это, основываясь на первом дне года

SELECT DAYNAME(MAKEDATE(2013,1))

Все вместе

SELECT STR_TO_DATE(CONCAT(CONCAT(2013, 1), DAYNAME(MAKEDATE(2013,1))), '%X%V %W')

вернуть '2013-01-08', что является плохим значением, которое мне нужно '2013-01-01'

SELECT STR_TO_DATE(CONCAT(CONCAT(2017, 1), DAYNAME(MAKEDATE(2017,1))), '%X%V %W')

здесь возвращается '2017-01-01', что хорошо

Моя проблема в том, что через несколько лет она ушла на следующую неделю, что плохо Я не уверен, где и что я делаю неправильно ... Поэтому, пожалуйста, любая помощь ...

Проблема:

В каком-то году, например, в 2013 году, когда я конвертирую год + неделю в дату, я получаю дату в течение одной дополнительной недели, например, 2013 год + 1 неделя дает 2013-01-08, то есть во вторую неделю вместо первой

но

В какой-то год, например, 2017, когда я конвертирую год + неделю в дату, я получаю дату на нужной неделе, например, 2017 год + 1 неделя дает 2017-01-01

Почему это поведение?

1 Ответ

0 голосов
/ 27 июня 2018

MySQL поддерживает интервалы, которые, кажется, являются лучшей функцией для создания даты из номера года и недели. См. Следующий запрос в качестве примера, который вычисляет первую неделю 2013 года и вторую неделю 2013 года.

SELECT DATE_ADD(makedate(`year`, 1), INTERVAL (`week` - 1) WEEK) as weekdate
FROM (
   (SELECT 2013 as `year`, 1 as `week`) UNION 
   (SELECT 2013 as `year`, 2 as `week`)
) t1

Вывод двух строк

weekdate
2013-01-01
2013-01-08

Следующее также работает, но гораздо менее легко читать

SELECT MAKEDATE(`year`, 1 + ((`week` - 1) * 7)) as weekdate 
FROM (
    (SELECT 2013 as `year`, 1 as `week`) UNION 
    (SELECT 2013 as `year`, 2 as `week`)
) t1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...