我创建了一个为逻辑失败的目的而定义的用户。基本上就是这样 使用某些逻辑添加日期,最后返回日期时间作为该函数的返回值。
为了简单起见我正在显示错误部分。 我的代码是
CREATE FUNCTION `BIZZ_fnMergeDate`(
) RETURNS VARCHAR(1000)
BEGIN
DECLARE v VARCHAR(1000);
SET v = STR_TO_DATE('08/06/2014 06:00 PM', '%c/%e/%Y %H:%i');
RETURN '';
END //
DELIMITER ;
这只是为了举例而非实际代码。
执行此操作时没有错误。但是当它被调用时会抛出以下错误
Error Code: 1292. Truncated incorrect datetime value: '08/06/2014 06:00 PM' 0.000 sec
但是这个特定的行
select STR_TO_DATE('08/06/2014 06:00 PM', '%c/%e/%Y %H:%i');
我带到外面并作为一个单独的查询运行它运行正常。
我不知道为什么在功能中它不起作用。看起来很奇怪。 请帮忙搞清楚。
答案 0 :(得分:2)
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format
您可能需要更改格式字符串以考虑日期/时间格式的PM部分:
'%c/%e/%Y %l:%i %p'
应该这样做。
此外,存储过程不会将运行时错误抛出,直到运行时,即使智能编译器可能在编译时抛出它们,因为它们基于常量。这是一种令人讨厌的方式,即在你运行存储的函数之前,MySQL无法告诉你这样的错误。
要回答您的问题,"如何将其转换为12 AM / PM格式"这是你需要知道的。 STR_TO_DATE()
将字符串转换为内部DATETIME
数据类型。这些有许多优点。它们是紧凑的,它们是可搜索的,等等。如果您尝试显示这样的数据类型或隐式将其转换为文本字符串,您将得到类似这样的格式:
2014-08-06 18:00:00
如果您希望将DATETIME
渲染为其他格式,例如上午12点/下午格式,则需要使用DATE_FORMAT()
来执行此操作。
对于我认为你想要的操作
DATE_FORMAT(whatever_date, '%c/%e/%Y %l:%i %p')
会做到这一点。在您的代码中,这变为
SET v = DATE_FORMAT(STR_TO_DATE('08/06/2014 06:00 PM', '%c/%e/%Y %l:%i %p'), '%c/%e/%Y %l:%i %p');
这有点奇怪,因为它从早上12点/下午的格式转换回相同的格式。但它应该指出你正确的方向。
答案 1 :(得分:0)
你应该这样做
DELIMITER //
CREATE FUNCTION `BIZZ_fnMergeDate`(
) RETURNS VARCHAR(1000) DETERMINISTIC
BEGIN
DECLARE v VARCHAR(1000);
SET v = STR_TO_DATE('08/06/2014 06:00 PM', '%c/%e/%Y %H:%i');
RETURN v;
END //
DELIMITER ;