У меня есть единственный запрос для обновления таблицы, и некоторые поля должны обновляться при определенных условиях, давайте представим этот случай:
У меня есть таблица с именем mytable, в ней есть поле DATETIME с именем установлен, это поле может быть пустым и по умолчанию имеет значение NULL, а иногда некоторые значения - «0000-00-00 00:00:00».
Когда я получаю данные от любого датчика (пример: идентификатор датчика 12457), я обновляю его значения следующим образом:
UPDATE mytable SET
temperature=35,
pressure=122,
installed=NOW(),
status=1
WHERE id=12457
если я получаю новые данные от того же датчика, я снова сохраняю его значения, но избегаю изменения установленного значения таким образом:
UPDATE mytable SET
temperature=35,
pressure=122,
installed=IF(installed IS NULL,NOW(),installed),
status=1
WHERE id=12457
Он работает так, как ожидалось, если установлено значение null, он сохраняет текущее время, если нет, он сохраняет предыдущую дату, но я получаю это предупреждение, когда дата равна '0000-00-00 00:00:00':
Предупреждение: значение вне допустимого диапазона для столбца "установлен" в строке 1
Как предложил Д-Ши, я попытался использовать COALESCE следующим образом, но получил то же предупреждение:
installed=COALESCE(installed,NOW())
Я подумал, что это из-за предыдущей даты, поэтому я намеренно попытался воспроизвести ошибку, сделав следующее:
UPDATE mytable SET
installed=installed,
WHERE id=12457
Но я не получил предупреждения.
Система работает правильно, но мне немного любопытно, почему я получаю это предупреждение, используя только функцию IF (или COALESCE)?
Отвечая на Мадур Бхайя:
SHOW CREATE TABLE mytable
CREATE TABLE `mytable` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`temperature` INT(11) NOT NULL DEFAULT '0',
`pressure` INT(11) NOT NULL DEFAULT '0',
`installed` DATETIME NULL DEFAULT NULL,
`status` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
Пример данных:
INSERT INTO `mytable` VALUES (12457, 35, 122, '2018-12-12 12:53:49', 1);
INSERT INTO `mytable` VALUES (12458, 40, 119, '0000-00-00 00:00:00', 1);
INSERT INTO `mytable` VALUES (12459, 34, 122, null, 1);
INSERT INTO `mytable` VALUES (12460, 36, 122, '2018-12-12 12:57:01', 1);
Версия MySQL: 5.7.23
P.Salmon теперь вы говорите это, у меня это предупреждение только на таких датах, как 0000-00-00 00:00:00, это может быть причиной?
Почему у вас есть значения даты 0000-00-00?
Я действительно не знаю, датчики сделаны с Raspberry PI, читающим строку CSV, я думаю, что иногда они не могут правильно прочитать дату.
Попробуйте COALESCE(CAST(installed AS DATETIME), CAST(NOW() AS DATETIME)). Просто из любопытства...
Алексей, приятно, никаких предупреждений при использовании CAST в установленном: installed=COALESCE(CAST(installed AS DATETIME), NOW()), зачем мне CAST, если это уже DATETIME? и почему я не делаю этого предупреждения: installed=installed?
@stramin, я думаю, это потому, что NOW () возвращает строку, а значение поля installed имеет тип DATETIME. И почему-то mysql не нравится, что в одном и том же IF или COALESCE у вас есть значения двух разных типов.
Хм ... нет, мой предыдущий комментарий неверен. Вы не транслируете NOW() и в любом случае не получаете предупреждения.
Это может быть ошибка MySQL или что-то в этом роде? : o






У вас есть 0000-00-00 00:00:00 как значения также в столбце installed. Вам также необходимо обрабатывать их, помимо значений null. Также перед запуском запроса вам необходимо установить sql_mode на '', так как это удалит более строгий режим SQL NO_ZERO_DATE.
SET SESSION sql_mode = '';
UPDATE mytable
SET
temperature = 35,
pressure = 122,
installed = IF(installed IS NULL OR installed = '0000-00-00 00:00:00',
NOW(),
installed),
status=1
WHERE id=12457
Спасибо, но теперь я получаю новое предупреждение: Warning: Incorrect datetime value: '0000-00-00 00:00:00' for column 'installed' at row 1, теперь меня это еще больше интересует ... И мне все еще интересно, почему это происходит только с условными функциями?
поделитесь результатом
SHOW CREATE TABLE mytable. Также поделитесь деталями некоторых образцов данных. Кроме того, какая у вас версия сервера MySQL?