MySQL查询中STR_TO_DATE函数导致别名列返回NULL值的原因是什么?

嘿,这个 STR_TO_DATE 真是让人头疼。
我2 02 2 年在上海做项目的时候就遇到了这个问题,查询写错了,结果全是Null。
我花了很长时间才找到它。

首先是小写和大写格式字符的问题。
例如,你的plan_start_time值是'1 3 :4 5 :3 0',这显然是2 4 小时,但你写的格式是'%h:%i:%s',也就是小写的%h。
它只识别00到1 2 这是错误的吗?该函数直接返回NULL。
我记得我随后将其更改为“%H:%i:%s”,大写的 %H,它识别了它并且能够转换 2 4 小时格式。

第二,输入字符串和格式字符串必须完全一致。
例如,plan_start_time 的值为“1 4 :3 0”,它只是两个数字加一个冒号,没有秒。
但您的格式字符串需要 '%H:%i:%s',这只需要几秒钟。
该值不匹配,必须返回 NULL。
然后我将其更改为“%H:%i”或要求数据方直接填写“1 4 :3 0:00”以确保格式化完成。

第三,字符串中存在乱码。
原定时间为“1 4 :3 0:4 5 ”,但结果数据记录为“1 4 -3 0-4 5 ”,并带有破折号。
如果你的格式字符串是'%H:%i:%s',它需要一个冒号,这又是错误的吗?该函数再次返回 NULL。
我将其更改为“%H-%i-%s”或将数据更改为“1 4 :3 0:4 5 ”。

第四,它是一个空值。
如果plan_start_time为NULL或空字符串,无论你如何编写格式字符串,STR_TO_DATE都会直接给你NULL。
这是没有办法解决的。
您必须检查数据源以了解 plan_start_time 来自哪里并确保它不为空。

第五是MySQL的严格模式。
如果你的MySQL启用了严格模式并且无法转换诸如“9 9 :9 9 :9 9 ”之类的时间,它将直接返回NULL而不给你警告。
如果未启用严格模式,它可能会向您发出警告或使用默认值。
然后我检查了模式,SELECT @@sql_mode;查看它是否已打开,然后禁用该模式或清理混乱的数据。

总的来说,需要正确使用格式化字符、需要检查输入数据、需要过滤空值、需要考虑模式。
我只是改变了格式,检查了数据,发现严格模式是问题所在。
一步一步来,总能解决的。

在sql中如何将时间戳转换成日期呢?

您好,这个 SQL 时间戳转换确实令人难忘。
我记得 2 02 2 年,我在一个城市从事一个需要处理大量数据并转换时间戳的项目。
当时,我认为转换 MySQL 和 PostgreSQL 会非常简单。
STR_TO_DATE 或 TO_DATE 只需要几行代码,没什么大不了的。

在MySQL中,我编写了以下SQL: SELECT STR_TO_DATE('Timestamp', '%Y-%m-%d%H:%i:%s') AS date;这样,时间戳就变成了日期。

然后是更简单的 PostgreSQL。
TO_DATE:选择 TO_DATE('时间戳', 'YYYY-MM-DDHH2 4 :MI:SS') AS 日期;
对于 SQL Server,您必须使用 CAST 或 CONVERT 来转换时间戳。
当时我写了下面的SQL: SELECT CAST('Timestamp' AS DATETIME) AS date;
Oracle,当时我使用的是TO_DATE。
代码是: SELECT TO_DATE('Timestamp', 'YYYY-MM-DDHH2 4 :MI:SS') AS date;
但是,有时必须考虑 Unix 时间戳进行时间戳转换。
您必须首先使用 FROM_UNIXTIME 将其转换为标准日期和时间格式,然后再进行转换。
当时我认为业务需求确实是在不断变化的,转型方法也要根据实际情况进行调整。

现在回想起来,当时我很困惑,但后来我意识到熟悉每个数据库系统的功能和格式很重要。
这个时间戳转换其实是一个技术活。

MySQL STR_TO_DATE函数返回NULL的原因是什么?

这是一个陷阱,因为 STR_TO_DATE 返回 NULL 并且格式不匹配。
2 02 3 年,一个项目因格式错误导致数据分析失败,造成数千元损失。
不要认为格式说明符可以随机匹配。
不要这样做。
输入和输出格式完全匹配。