создание ряда периодов времени в виде строк - PullRequest
2 голосов
/ 17 декабря 2010

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

Например, учитывая дату начала 13 ноября 2010 года и текущую дату 12-16-2010, я хочу получить такой набор результатов, как

+------------+------------+
| Start      | End        |
+------------+------------+
| 2010-11-15 | 2010-11-21 |
+------------+------------+
| 2010-11-22 | 2010-11-28 |
+------------+------------+
| 2010-11-29 | 2010-12-05 |
+------------+------------+
| 2010-12-06 | 2010-12-12 |
+------------+------------+

Это не идет после 12, потому что недельный период, в котором происходит текущая дата, не завершен.

Я не могу понять, как бы я начал писать этот запрос. Могу ли я сделать это в одном запросе? Или я должен использовать код для циклов и выполнять несколько запросов?

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

Довольно сложно (но не невозможно) создать такой результирующий набор динамически в MySQL, поскольку он еще не поддерживает ни один из рекурсивных CTE , CONNECT BY или generate_series , который я бы использовал для этого в других базах данных.

Вот альтернативный подход, который вы можете использовать.

Создайте и предварительно заполните таблицу, содержащую все возможные строки с некоторой даты далеков прошлом до какой-то даты далеко в будущем.Затем вы можете легко получить нужный результат, запросив эту таблицу с помощью предложения WHERE, используя индекс для повышения эффективности запроса.

Недостатки этого подхода довольно очевидны:

  • Это занимает ненужное место для хранения.
  • Если вы сделаете запрос вне диапазона, которым вы заполнили вашу таблицу, вы не получите никаких результатов, а это значит, что вам придется либо заполнить таблицу достаточным количеством дат, чтобыпоследний срок действия вашего приложения, иначе вам понадобится скрипт для добавления новых дат.

См. также этот связанный вопрос:

0 голосов
/ 17 декабря 2010

Осторожно, это просто концептуальная идея: у меня нет установки mysql здесь, так что я не могу ее протестировать.

Однако я бы опирался на таблицу, содержащую целые числа, чтобы эмулироватьсерия.

Что-то вроде:

CREATE TABLE integers_table
(
  id integer primary key
);

С последующим (предупреждение, это псевдокод)

  INSERT INTO integers_table(0…32767);

(это должно быть достаточно недель до концанаши жизни: -)

Затем

FirstMondayInUnixTimeStamp_Utc= 3600 * 24 * 4
SecondPerday=3600 * 24

(так как 1 января 1970 года был четверг. Остерегайтесь, я не перепроверил! Я мог бы уйти несколько часов!)

А потом

CREATE VIEW weeks
AS 
  SELECT integers_table.id AS week_id,
  FROM_UNIXTIME(FirstMondayInUnixTimeStamp_Utc  + week_id * SecondPerDay * 7) as week_start
  FROM_UNIXTIME(FirstMondayInUnixTimeStamp_Utc + week_id * SecondPerDay * 7 + SecondPerDay * 6) as week_end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...