Как объединить date_add с сгенерированным всегда, чтобы вычислить даты в столбце - PullRequest
0 голосов
/ 07 марта 2020

DB Fiddle

CREATE TABLE Days (
    id int primary key,
    date_fix VARCHAR(255),
    date_calculated VARCHAR(255) GENERATED ALWAYS AS (DATE_ADD("date_fix", INTERVAL 1 DAY))
);

INSERT Days
(id, date_fix, date_calculated
)
VALUES 
("1", "2019-01-01", ""),
("2", "2019-01-06", ""),
("3", "2019-05-01", ""),
("4", "2019-08-15", ""),
("5", "2019-10-03", "");

В приведенной выше таблице я хочу вставить столбец с именем date_calculated, который вычисляет дату следующим образом:

date_fix + 1 day

Поэтому я попытался объединить GENERATED ALWAYS с DATE_ADD("date_fix", INTERVAL 1 DAY), но пока не смог заставить его работать.

Я предполагаю, что проблема связана с оператором INSERT, так как в настоящее время я используйте только "" для столбца date_calculated, но я не имею ни малейшего понятия, как заменить этот "", чтобы добиться того, чтобы столбец был рассчитан, как описано.

Есть ли у вас какие-либо идеи, как получить нужную таблицу с рассчитанным столбцом?

Ответы [ 3 ]

2 голосов
/ 07 марта 2020

Вы должны добавить DATE перед DATE_ADD в своем запросе

CREATE TABLE Days (
   id int primary key,
   date_fix VARCHAR(255),
   date_calculated VARCHAR(255) 
   GENERATED ALWAYS AS (DATE(DATE_ADD(date_fix, INTERVAL 1 DAY)))
);

Затем вы можете вставить свои данные

INSERT INTO Days (id, date_fix)
    VALUES ("1", "2019-01-01"),
           ("2", "2019-01-06"),
           ("3", "2019-05-01"),
           ("4", "2019-08-15"),
           ("5", "2019-10-03");
1 голос
/ 07 марта 2020

Ваш код отлично работает с парой исправлений:

CREATE TABLE Days (
    id int primary key,
    date_fix VARCHAR(255),
    date_calculated VARCHAR(255) GENERATED ALWAYS AS (DATE_ADD(date_fix, INTERVAL 1 DAY))
);

INSERT Days (id, date_fix)
VALUES (1, '2019-01-01'),
       (2, '2019-01-06'),
       (3, '2019-05-01'),
       (4, '2019-08-15'),
       (5, '2019-10-03');

Здесь - это db <> скрипка.

Ваша главная проблема в том, что вы довольно запутался в кавычках. При написании SQL это довольно просто:

  • Используйте ЕДИНСТВЕННЫЕ кавычки для даты и строковых констант.
  • Никогда не используйте кавычки вообще для чисел.
  • Делать не используйте двойные кавычки (если вы действительно не понимаете, почему вы их используете). MySQL расширяет SQL, так что это синоним одинарных кавычек.

Вторая проблема заключается в том, что нет необходимости вставлять значение в сгенерированный столбец. Значение вычисляется при запросе столбца, а не при вставке значений.

Тогда третья проблема - это типы. Не храните даты в виде строк. MySQL имеет замечательный тип данных для хранения дат, который называется date. Он был изобретен по какой-то причине, и вы должны его использовать.

0 голосов
/ 07 марта 2020

Подход, который вы используете для создания столбцов, не является правильным и не рекомендуется.

Правильный подход для этой логики c будет состоять в том, чтобы создать таблицу только с Id & date_fix и затем использовать выберите заявление генерировать ваши рассчитанные результаты. Зачем использовать этот метод? Как, Вы будете без необходимости создавать новый столбец для хранения информации, которую можно получить из оператора выбора, не будет достаточно масштабируемым для работы в среде большого предприятия. Поэтому всегда старайтесь свести к минимуму нагрузку.

Пожалуйста, найдите следующий код:

CREATE TABLE Days (
    id int primary key,
    date_fix VARCHAR(255)
);

INSERT Days
(id, date_fix
)
VALUES 
('1', '2019-01-01'),
('2', '2019-01-06'),
('3', '2019-05-01'),
('4', '2019-08-15'),
('5', '2019-10-03');

select id,date_fix, DATEADD(DAY,1,CAST(date_fix as DATETIME)) from Days;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...