Ошибка рабочего места 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

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

  1. В моем документе PHP, как бы я преобразовал строку, которую я получаю из Android Studio volley, в дату. (Я правильно получаю переменную с помощью $start=$_Post("start"), так что это работает, но я не могу преобразовать ее во время. Я посмотрел в Интернете и попробовал все, что выглядело так, как будто это работает.

  2. Преобразование с помощью кода SQL, я уже пробовал CAST и CONVERT, ни то, ни другое не работает. Моя начальная колонка - тип TIME(6).

Author: jewstin, 2018-06-01

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.

 0
Author: spencer7593, 2018-06-01 20:43:11