首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >mySQL工作台错误:语法错误,意外的单引号

mySQL工作台错误:语法错误,意外的单引号
EN

Stack Overflow用户
提问于 2018-06-02 03:43:00
回答 1查看 1.1K关注 0票数 2

我试图用PHP编写一条SQL语句,将字符串转换为时间(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 03’(单引号文本)“

我不知道如何修复这个问题,这个表已经存在,我已经成功地使用诸如SELECT activityid=2 FROM xxxxxx.scheudling之类的语句获得了其他信息

我想我有两个问题,两个答案都行。

  1. 在我的PHP文档中,我如何将我得到的字符串从Android Studio截击转换为日期。(使用$start=$_Post("start"),我正确地获取了变量,所以它可以工作,但我不能将它转换为时间。我在网上看了看,通过SQL Code尝试了所有看起来可以工作的东西,我已经尝试了CASTCONVERT,都不起作用。我的start列是TIME(6).

类型

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 04:08:43

我建议使用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

在这里的DATE_FORMAT下记录了STR_TO_DATE的格式模式

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

第二个后续

使用OP报告的相同sql_mode设置:

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

更复杂的表达式是一种解决方法,可以避免sql_mode中的STRICT_TRANS_TABLESNO_ZERO_DATE强加的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50650110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档