当前位置: 首页 > 知识库问答 >
问题:

#1411 -插入时函数str_to_date的日期时间值不正确...挑选

白宏放
2023-03-14

这些查询需要将字符串转换为日期,因为时间戳存储为字符串,并且日志应用程序是不可更改的。

我有一个完美的选择查询 -

(SELECT main.user_id, main.Timestamp
FROM `user_table` main
WHERE STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) <
  (SELECT  MAX(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' )) 
   FROM `user_table` sub
   WHERE sub.user_id = main.user_id ))

这将从我的表中选择所有但最近添加的用户ID和时间戳。

但是,当我尝试将其插入到另一个表中时...就像这样——

INSERT INTO user_table_temp (`user_id`, `Timestamp`)
(SELECT main.user_id, main.Timestamp
FROM `user_table` main
WHERE STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) <
  (SELECT  MAX(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' )) 
   FROM `user_table` sub
   WHERE sub.user_id = main.user_id ))

我得到以下错误-

#1411 - Incorrect datetime value: 'Mon Mar 14 16:10:10 CDT 2011' for function str_to_date

这样做的原因是因为我的时间戳以两种格式存储。一种在非夏令时存储为“CST”,另一种在夏令时存储为“CDT”。当INSERT INTO SELECT到达与我查询的内容相反的第一行时,它将在上面的消息中失败。

我也尝试过合并它们,这在运行select时也是有效的

INSERT INTO user_table_temp  (`user_id `, `Timestamp`)
(SELECT main.user_id , main.Timestamp
FROM `user_table` main
WHERE COALESCE(STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ), STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' )) <
  (SELECT  MAX(COALESCE(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ), STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' ))) 
   FROM `user_table` sub
   WHERE sub.user_id = main.user_id ))

为什么插入时会失败,但选择会起作用?

共有1个答案

凌远
2023-03-14

我认为它在插入时会失败,因为你没有使用支持的格式。支持的格式。。。

作为“YYYY-MM-DD HH: MM: SS”或“YY-MM-DD HH: MM: SS”格式的字符串。这里也允许使用“宽松”语法:任何标点符号都可以用作日期部分或时间部分之间的分隔符。例如,“2012-12-31 11:30:45”、“2012^12^31 11 30 45”、“2012/12/31 11*30*45”和“2012@12@31 11^30^45”是等效的。

作为一个没有分隔符的字符串,格式为“yyyymmddhhmms”或“yyymddhhmms”,前提是该字符串作为日期有意义。例如,“20070523091528”和“070523091528”被解释为“2007-05-23 09:15:28”,但“071122129015”是非法的(它有一个无意义的分钟部分),并变为“0000-00-00 00:00:00”。

以yyyymmddhhmms或yymmddhhmms格式的数字,前提是该数字作为日期有意义。例如,19830905132800和830905132800被解释为“1983-09-05 13:28:00”。

 类似资料:
  • 问题内容: 我对约会有点困惑。我目前正在使用天气应用程序,并且一切正常。.我只是想将这种类型的格式处理成我自己想要的格式。 我只是想将此日期转换为大纪元时间,然后以所需的格式结算日期:: 对于J-SON 或者我想将此日期转换为更少的数字,例如,Sun,9月9日9:23 Am等。 http://dataservice.accuweather.com/currentconditions/v1/2570

  • 在 Lua 中,函数 time、date 和 difftime 提供了所有的日期和时间功能。 在 OpenResty 的世界里,不推荐使用这里的标准时间函数,因为这些函数通常会引发不止一个昂贵的系统调用,同时无法为 LuaJIT JIT 编译,对性能造成较大影响。推荐使用 ngx_lua 模块提供的带缓存的时间接口,如 ngx.today, ngx.time, ngx.utctime, ngx.l

  • 在我的MySQL数据库中,我有一个有三列的表,如下所示 notification_time是时间的数据类型。 在我的Spring-boot应用程序中,为表建模

  • 下面是我们用来填充SQL数据库中的表的存储过程。@excDate是从C#批处理作业中发送的参数,该作业从和Excel电子表格中获取值。 如果当前代理的培训处于活动状态,则电子表格的“过期日期”单元格中不会有值。这将导致从C#代码向存储过程发送一个空字符串,然后将其转换为日期时间值1900-01-01。在我需要使用光标将新记录插入表之前,这一切都是正常的。 如果@exDate值是1900-01-01

  • 问题内容: 我有一个脚本,需要在脚本的不同行执行以下命令: 在我的陈述中,我有以下内容: 我收到以下错误: 如果我将语句的顺序更改为: 我收到以下错误: 如果我再次将语句更改为: 我收到以下错误: 这是怎么回事,我怎么都可以工作? 问题答案: 您的麻烦是,您有一些代码希望对 模块 进行引用,而其他代码希望对类进行引用 。 显然,不能两者兼有。 当您这样做时: 您首先要设置为对该类的引用,然后立即将

  • 问题内容: 我最近接手了一个十年前创建的旧项目。它使用MySQL 5.1。 除其他外,我需要将默认字符集从latin1更改为utf8。 例如,我有这样的表: 我设置了自己的Mac来进行此工作。不用考虑太多,我运行了“ brew install mysql”,它安装了MySQL 5.7。所以我有一些版本冲突。 我下载了此数据库的副本并将其导入。 如果我尝试运行这样的查询: 我收到此错误: 我以为可以