Ошибка рабочего места MySQL: Синтаксическая ошибка, неожиданные одинарные кавычки
Я пытался сделать инструкцию SQL на PHP, чтобы преобразовать строку во время(6). Но я перепробовал все за последние 12 часов и не продвинулся ни на дюйм. Я пробовал эти утверждения, все они приводят к одной и той же ошибке.
UPDATE scheduling SET start='03:42PM' WHERE activityid=2;
UPDATE scheduling SET start=CONVERT(TIME(6),'03:42PM');
INSERT INTO scheduling(start) VALUES (start=CONVERT(TIME(6),'03:42PM'));
INSERT INTO scheduling(start) VALUES (start=CONVERT(TIME(6),'03:42PM'));
INSERT INTO scheduling(start) VALUES (start=CONVERT(TIME(6),'15:42'));
Ошибка
Синтаксическая ошибка: неожиданное "03:42 вечера" (текст в одинарных кавычках)"
Я не знаю, как это исправить, таблица существует, и я успешно получил другую информацию, используя такие операторы, как SELECT activityid=2 FROM xxxxxx.scheudling
Я думаю, у меня есть два вопроса, любой из которых сработает.
В моем документе PHP, как бы я преобразовал строку, которую я получаю из Android Studio volley, в дату. (Я правильно получаю переменную с помощью
$start=$_Post("start")
, так что это работает, но я не могу преобразовать ее во время. Я посмотрел в Интернете и попробовал все, что выглядело так, как будто это работает.Преобразование с помощью кода SQL, я уже пробовал
CAST
иCONVERT
, ни то, ни другое не работает. Моя начальная колонка - типTIME(6)
.
1 answers
Я рекомендую тестировать выражения с помощью оператора SELECT.
Во-первых, аргументы функции MySQL CONVERT
переворачиваются назад.
Синтаксис таков CONVERT(expr,type)
И type
предоставляются в качестве ключевого слова, а не строкового литерала. Например:
SELECT CONVERT('235',SIGNED)
Для преобразования в тип данных TIME
SELECT CONVERT( '15:42' ,TIME(6)) // => 15:42:00.000000
Часть 'PM' строкового литерала будет проигнорирована.
SELECT CONVERT( '03:42PM' ,TIME(6)) // => 03:42:00.000000
Мы можем использовать функцию STR_TO_DATE
для возврата значения ВРЕМЕНИ из строки, которая содержит индикатор AM/PM
SELECT STR_TO_DATE( '03:42PM' ,'%h:%i%p')
И нет необходимости приводить это к TIME(6)
, мы можем сделать это:
UPDATE scheduling
SET start = STR_TO_DATE( '03:42PM' ,'%h:%i%p')
WHERE activityid = 2
Функция STR_TO_DATE
описана здесь:
Https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_str-to-date
Шаблоны форматов для STR_TO_DATE
задокументированы здесь, в разделе DATE_FORMAT
:
Https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format
ПОСЛЕДУЮЩИЕ ДЕЙСТВИЯ
Демонстрация:
Настройка
USE test;
CREATE TABLE scheduling (activityid INT PRIMARY KEY, start TIME(6));
-- 0 row(s) affected
INSERT INTO scheduling (activityid) VALUES (2);
-- 1 row(s) affected
Выполните инструкцию update в ответе выше
UPDATE scheduling SET start = STR_TO_DATE( '03:42PM' ,'%h:%i%p') WHERE activityid = 2 ;
-- 1 row(s) affected
Результаты
SELECT * FROM scheduling WHERE activityid = 2;
-- activityid start
-- ---------- ---------------
-- 2 15:42:00.000000
ВТОРОЕ ПОСЛЕДУЮЩЕЕ НАБЛЮДЕНИЕ
Используйте ту же настройку sql_mode
, о которой сообщает OP:
SET @@sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ;
Тест:
SELECT STR_TO_DATE( '03:42PM' ,'%h:%i%p')
Возвращает
(NULL)
Но это более сложное выражение:
SELECT TIME(STR_TO_DATE(CONCAT(CURRENT_DATE(),' ', '03:42PM' ),'%Y-%m-%d %h:%i%p'))
Возвращает
15:42:00
Более сложное выражение является обходным путем, позволяющим избежать поведения, навязанного STRICT_TRANS_TABLES
и NO_ZERO_DATE
в sql_mode
.