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