获取日期转换MySQL时出错

时间:2014-08-06 13:03:23

标签: mysql

我创建了一个为逻辑失败的目的而定义的用户。基本上就是这样 使用某些逻辑添加日期,最后返回日期时间作为该函数的返回值。

为了简单起见我正在显示错误部分。 我的代码是

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');

我带到外面并作为一个单独的查询运行它运行正常。

我不知道为什么在功能中它不起作用。看起来很奇怪。 请帮忙搞清楚。

2 个答案:

答案 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 ;