MySQL: как рассчитать недели от определенной даты?

Мне нужно вычислить недели от даты в моем операторе выбора MySQL. В одной из таблиц есть столбец с датой, и мне нужно подсчитать, сколько недель прошло с этой даты.

SELECT EventDate, (calculation) AS WeeksOut FROM Events;

Пример:

  • 6 дней, недели = 0
  • 7 дней, недели = 1
  • 13 дней, недели = 1
  • 14 дней, недели = 2

5 ответов

Решение

Используйте функцию DATEDIFF:

ROUND(DATEDIFF(end_date, start_date)/7, 0) AS weeksout

Проблема с WEEKS заключается в том, что он не будет возвращать правильные результаты для дат, которые пересекают 1 января.

0 количество десятичных разрядов для использования в ROUND функция.

Для того, чтобы пройти весь "новогодний" вопрос, и вы все еще хотите использовать WEEK() Я нашел следующий метод довольно эффективным.

SELECT 
    YEAR(end_date)*52+WEEK(end_date)
    - YEAR(start_date)*52 - WEEK(start_date) as weeks_out
FROM
    events;

Разница с этим методом (в отличие от DATEDIFF метод) заключается в том, что он выровнен по неделям. Так что сегодня (который понедельник) и в прошлую пятницу вернется 1 используя этот метод, но вернет 0 с DATEDIFF метод

Вот простой способ сделать это:

SELECT EventDate, (week(EventDate) - week(curdate())) AS WeeksOut FROM Events;

Пример:

mysql> select week('2010-11-18') - week ('2010-10-18');
+------------------------------------------+
| week('2010-11-18') - week ('2010-10-18') |
+------------------------------------------+
|                                        4 |
+------------------------------------------+
1 row in set (0.00 sec)

Другой вариант - рассчитать интервал в днях и разделить на 7:

SELECT EventDate, datediff(EventDate,curdate())/7 AS WeeksOut FROM Events;

Пример:

mysql> select datediff('2010-11-18' , '2010-10-18') / 7;
+-------------------------------------------+
| datediff('2010-11-18' , '2010-10-18') / 7 |
+-------------------------------------------+
|                                    4.4286 |
+-------------------------------------------+
1 row in set (0.00 sec)

В более новых версиях MYSQL, если вы используете метку времени в качестве типа столбца, вы можете использовать TIMESTAMPDIFF:

SELECT TIMESTAMPDIFF(WEEK, '2020-06-09 08:59:36', '2020-09-09 08:58:25');
|-----------------------------------------------------------------------|
|                                                                    13 |

Итак, в вашем примере это будет:

SELECT TIMESTAMPDIFF(WEEK, NOW(), EventDate) AS WeeksOut FROM Events;

Попробуйте TIMESTAMPDIFF

TIMESTAMPDIFF(WEEK, curdate(), EventDate) AS WEEKS_DIFFERENCE

Другие вопросы по тегам