MySQL: как рассчитать недели от определенной даты? - PullRequest
7 голосов
/ 18 октября 2010

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

SELECT EventDate, (calculation) AS WeeksOut FROM Events;

Пример:

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

Ответы [ 3 ]

17 голосов
/ 18 октября 2010

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

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

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

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

3 голосов
/ 03 ноября 2014

Чтобы обойти весь «новогодний» вопрос, и вы все еще хотите использовать 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 методом

3 голосов
/ 18 октября 2010

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

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)
...