Заполните mysql с датами за период времени от php

0

У меня есть таблица mysql со следующими столбцами: Date, Km

Я хотел бы сделать несколько строк с датами, например. 2018-01-01 - 2018-02-20.

Столбец "Km" должен содержать значение 0.

Как это сделать с помощью PHP и mysql?

Я не могу выполнить эту работу:

<?php
$DateQuery = "

CREATE PROCEDURE fill_calendar(start_date Date, end_date Date)
BEGIN
  DECLARE crt_date Date;
  SET crt_date=start_date;
  WHILE crt_date < end_date DO
    INSERT INTO run VALUES(crt_date);
    SET crt_date = ADDDATE(crt_date, INTERVAL 1 DAY);
  END WHILE;
END

";

// Perform Query
$result = mysql_query("CALL fill_calendar('2018-01-01', '2018-02-20')");
?>
  • 0
    Здравствуйте! Добро пожаловать в StackOverflow. Мы здесь не для того, чтобы писать ваш код для вас, вам нужно сообщить нам некоторые ваши усилия / попытки, спасибо.
  • 0
    Обновлен с кодом, который у меня есть, но это не работает.
Показать ещё 2 комментария
Теги:
date

2 ответа

0
Лучший ответ

Не знаете, для чего вы хотите сохранить хранимую процедуру. Все, что вам нужно - это один запрос INSERT, например

$period = new DatePeriod(
    new DateTimeImmutable('2018-01-01 00:00:00'),
    new DateInterval('P1D'),
    new DateTimeImmutable('2018-02-20 23:59:59')
);

$values = implode(',', array_map(
    function(DateTimeInterface $dt) {
        return sprintf('(%s)', $dt->format('Y-m-d'));
    },
    iterator_to_array($period)
));

echo "INSERT INTO run VALUES $values";

Это будет печатать (некоторые значения опущены для краткости)

INSERT INTO run VALUES (2018-01-01),(2018-01-02),[…],(2018-02-20)

которые затем можно выполнить против базы данных с вашим выбором db lib.

  • 0
    Вы правы, это более простой способ сделать это. Работает отлично. Спасибо!
0

Работает для меня... (однако для этого нужен действительный диапазон дат)

DELIMITER $

CREATE PROCEDURE fill_calendar(start_date Date, end_date Date)
BEGIN
  DECLARE crt_date Date;
  SET crt_date=start_date;
  WHILE crt_date < end_date DO
    INSERT INTO run VALUES(crt_date);
    SET crt_date = ADDDATE(crt_date, INTERVAL 1 DAY);
  END WHILE;
END
$

-- Query OK, 0 rows affected (0.03 sec)

DELIMITER ;


CREATE TABLE run(crt_date DATE NOT NULL);

-- Query OK, 0 rows affected (2.14 sec)

CALL fill_calendar('2018-01-01', '2018-02-20');

-- Query OK, 1 row affected (0.52 sec)

SELECT * FROM run;
+------------+
| crt_date   |
+------------+
| 2018-01-01 |
| 2018-01-02 |
| 2018-01-03 |
| 2018-01-04 |
| 2018-01-05 |
| 2018-01-06 |
| 2018-01-07 |
| 2018-01-08 |
| 2018-01-09 |
| 2018-01-10 |
| 2018-01-11 |
| 2018-01-12 |
| 2018-01-13 |
| 2018-01-14 |
| 2018-01-15 |
| 2018-01-16 |
| 2018-01-17 |
| 2018-01-18 |
| 2018-01-19 |
| 2018-01-20 |
| 2018-01-21 |
| 2018-01-22 |
| 2018-01-23 |
| 2018-01-24 |
| 2018-01-25 |
| 2018-01-26 |
| 2018-01-27 |
| 2018-01-28 |
| 2018-01-29 |
| 2018-01-30 |
| 2018-01-31 |
| 2018-02-01 |
| 2018-02-02 |
| 2018-02-03 |
| 2018-02-04 |
| 2018-02-05 |
| 2018-02-06 |
| 2018-02-07 |
| 2018-02-08 |
| 2018-02-09 |
| 2018-02-10 |
| 2018-02-11 |
| 2018-02-12 |
| 2018-02-13 |
| 2018-02-14 |
| 2018-02-15 |
| 2018-02-16 |
| 2018-02-17 |
| 2018-02-18 |
| 2018-02-19 |
+------------+
50 rows in set (0.00 sec)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню