mysql-如何连接字符串并将字符串转换为日期? 请看一下我的存储过程代码。 测试数据: 忍者活动|忍者ID |得分|日期 1 1 24 2012-05-01 2 1 36 2012-05-06 3 1 29 2012-05-11

mysql-如何连接字符串并将字符串转换为日期? 请看一下我的存储过程代码。 测试数据: 忍者活动|忍者ID |得分|日期 1 1 24 2012-05-01 2 1 36 2012-05-06 3 1 29 2012-05-11,mysql,stored-procedures,Mysql,Stored Procedures,函数调用:调用getTotalMonthyScore(2012年1月5日) 我正试图根据忍者ID获得任何忍者的每月得分 为什么不工作?知道我哪里出错了吗?而不是: SELECT DAY(LAST_DAY(year + '-' + month + '-01')) INTO maxDay; 换成 SET maxDay := DAY(LAST_DAY(CAST(CONCAT(year, '-',month,'-01) as DateTime))); CONCAT()是关键。 之前: 之后: 从贝克

函数调用:
调用getTotalMonthyScore(2012年1月5日)

我正试图根据
忍者ID
获得任何忍者的每月得分

为什么不工作?知道我哪里出错了吗?

而不是:

SELECT DAY(LAST_DAY(year + '-' + month + '-01')) INTO maxDay;
换成

SET maxDay := DAY(LAST_DAY(CAST(CONCAT(year, '-',month,'-01) as DateTime)));
CONCAT()是关键。

之前: 之后:
从贝克的回答中得到了这个想法后,我有了这个可行的解决方案

CREATE DEFINER=`ninjaboy`@`localhost` PROCEDURE `getMonthlyTotalScore`(IN ninjaId int,  IN month int, IN year int)
BEGIN
    DECLARE startDate DATE;
    DECLARE endDate DATE;
    DECLARE maxDay INTEGER;

    SELECT DAY(LAST_DAY(CONCAT(year,'-',month,'-01'))) INTO maxDay;

    SET startDate =  CONCAT(year,'-',month,'-01');
    SET endDate = CONCAT(year,'-',month,'-',maxDay);

    SELECT SUM(SCORE) FROM NINJA_ACTIVITY WHERE NINJA_ID = ninjaId AND DATE BETWEEN startDate AND endDate ORDER BY DATE;
END

人类的思想不是编者。你犯了什么错误?@beck03076我没有犯任何错误。它只返回0(结果);那么,你怎么能如此确定问题在于日期处理?我们无法确定,因为您没有提供样本数据。请稍等,您返回的是什么,out变量在哪里?。我认为您应该编写一个存储函数。@NinjaBoy:为您排序(您只需将其包装在
标记中即可)。@johntotetwoo事实上,他们这样做了。它可能缺少MySQL执行LTR求值的解释,并且由于左操作数是
Int
,因此它也将透明地将所有后续操作数强制转换为
Int
。。。这就是OP中的问题。是的,我明白了,对不起。OP缺少信息。@Romain:OP是什么?很明显,没有使用CONCAT(),而是使用了“a”+“b”。请原谅我的大脑。大多数时候这有点愚蠢。你们在讨论什么?OP=>原创帖子。约翰说你不回答这个问题,我说你回答,因为这个问题是在整数上下文中从左到右计算
+
。@Romain:我欠你一个。谢谢你。拿着我的电话号码,可以的时候给我打电话。"9999999999999". 哈哈哈。不能在这附近这样做,对吗?。否则我们为什么会在这里,去太空书,我的脸或其他什么。只是开玩笑。再次感谢您的信息!
SET maxDay := DAY(LAST_DAY(CAST(CONCAT(year, '-',month,'-01) as DateTime)));
mysql> CREATE  PROCEDURE `getMonthlyTotalScore`(IN ninjaId int,  IN month int, IN year int)
        -> BEGIN
        ->     DECLARE startDate DATE;
        ->     DECLARE endDate DATE;
        ->     DECLARE maxDay INTEGER;
        -> 
        ->     SELECT year + '-' + month + '-01'; #NOTE THIS
        -> 
        ->     
        -> END;    
        -> |
    Query OK, 0 rows affected (0.00 sec)

    mysql> call getMonthlyTotalScore(1,5,2012);
        -> |
    +----------------------------+
    | year + '-' + month + '-01' |
    +----------------------------+
    |                       2016 |
    +----------------------------+
    1 row in set (0.00 sec)
mysql> CREATE  PROCEDURE `getMonthlyTotalScore`(IN ninjaId int,  IN month int, IN year int)
    -> BEGIN
    ->     DECLARE startDate DATE;
    ->     DECLARE endDate DATE;
    ->     DECLARE maxDay INTEGER;
    -> 
    ->     SELECT CONCAT(year,'-',month,'-01'); # NOTE THIS
    -> 
    ->     
    -> END;    |
Query OK, 0 rows affected (0.00 sec)

mysql> call getMonthlyTotalScore(1,5,2012);
    -> |
+------------------------------+
| CONCAT(year,'-',month,'-01') |
+------------------------------+
| 2012-5-01                    |
+------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
CREATE DEFINER=`ninjaboy`@`localhost` PROCEDURE `getMonthlyTotalScore`(IN ninjaId int,  IN month int, IN year int)
BEGIN
    DECLARE startDate DATE;
    DECLARE endDate DATE;
    DECLARE maxDay INTEGER;

    SELECT DAY(LAST_DAY(CONCAT(year,'-',month,'-01'))) INTO maxDay;

    SET startDate =  CONCAT(year,'-',month,'-01');
    SET endDate = CONCAT(year,'-',month,'-',maxDay);

    SELECT SUM(SCORE) FROM NINJA_ACTIVITY WHERE NINJA_ID = ninjaId AND DATE BETWEEN startDate AND endDate ORDER BY DATE;
END