Mysql 如何将上个月的值相加?

Mysql 如何将上个月的值相加?,mysql,sql,Mysql,Sql,我正在尝试对上个月输入的金额进行合计(设置) 结构如下: CREATE TABLE tester ( date_amount date, amount int); INSERT INTO tester VALUES ("2014-08-01", 1000), ("2014-08-02", 1001), ("2014-08-03", 1002), ("2014-08-31", 2000), ("2014-08-31", 2000), ("2014-08-31", 2000), ("2014-0

我正在尝试对上个月输入的金额进行合计(设置)

结构如下:

CREATE TABLE tester (
date_amount date,
amount int);


INSERT INTO tester VALUES
("2014-08-01", 1000),
("2014-08-02", 1001),
("2014-08-03", 1002),
("2014-08-31", 2000),
("2014-08-31", 2000),
("2014-08-31", 2000),
("2014-09-01", 1006);
这里以示例为例

如果我输入year=2014,month=9,那么我应该自动将在本例中输入的月份最后一天的“2014-08-31”中的所有金额相加

以下是:


查询必须对上个月最后一天键入的所有金额求和

因此,我必须:

SUM(AMOUNT)
6000
我试过了,但不是正确的方法,因为我知道这个月的最后一天:

SET @month := 09;
SET @year := 2014;

select sum(amount) from tester 
where   month(date_amount)= @month-1 and day(date_amount)= 31
我也尝试了这个查询,但是得到了NULL

SET @month := 09;
SET @year := 2014;

SELECT sum(amount)FROM tester 
WHERE month(date_amount)= @month-1 AND day(date_amount) =last_day(day(date_amount))

请有人帮我解决这个问题?

不要使用月份的第一天和最后一天,只使用带有TO_CHAR(YYYYMM)的年份和月份


在Mysql中,您可以使用DATE_格式(DATE_amount,%Y%m')而不是to_char

而不是使用月份的第一天和最后一天,只使用带有to_char(yyyyymm)的年份和月份

在Mysql中,您可以使用DATE_格式(DATE_amount,%Y%m'),而不是to_char

SELECT SUM(AMOUNT) FROM Tester
WHERE date_amount = LAST_DAY(STR_TO_DATE(@Month + '/00/' + @Year, '%m/%d/%Y'))
如果对表中的部分行使用函数,则强制sql执行表扫描。如果您将数据转换为完整字段,它可以在搜索中使用索引。

类似以下内容:

SELECT SUM(AMOUNT) FROM Tester
WHERE date_amount = LAST_DAY(STR_TO_DATE(@Month + '/00/' + @Year, '%m/%d/%Y'))

如果对表中的部分行使用函数,则强制sql执行表扫描。如果您将数据转换为完整字段,它可以在搜索中使用索引。

而不是只提供月份和年份。请提供实际日期,然后您可以获得所需的结果

SET @month := 09;
SET @year := 2014;

SELECT sum(amount)FROM tester 
WHERE month(date_amount)= @month-1 AND day(date_amount) = day(last_day(date_amount))

或者,您可以使用
STR_TO_DATE
将给定的月份和年份首先转换为日期,并使用该日期代替
@DATE

而不只是提供月份和年份。提供实际日期,然后您就可以得到想要的结果

SET @month := 09;
SET @year := 2014;

SELECT sum(amount)FROM tester 
WHERE month(date_amount)= @month-1 AND day(date_amount) = day(last_day(date_amount))
或者,您可以使用
STR_TO_DATE
将给定的月份和年份首先转换为日期,并使用该日期代替
@DATE

,这可能有助于:

SET @month := 09;
SET @year := 2014;

SELECT sum(amount) FROM tester 
WHERE month(date_amount)= @month-1 and date_amount = last_Day(date_amount)
这可能有助于:

SET @month := 09;
SET @year := 2014;

SELECT sum(amount) FROM tester 
WHERE month(date_amount)= @month-1 and date_amount = last_Day(date_amount)

如上所述,比较列时最好不首先应用函数

SET @month = '09', @year = '2014';

SELECT
    SUM(amount) total
FROM
    tester
WHERE
    date_amount = STR_TO_DATE(CONCAT_WS('-', @year, @month, '01'), '%Y-%m-%d') - INTERVAL 1 DAY  

如上所述,比较列时最好不首先应用函数

SET @month = '09', @year = '2014';

SELECT
    SUM(amount) total
FROM
    tester
WHERE
    date_amount = STR_TO_DATE(CONCAT_WS('-', @year, @month, '01'), '%Y-%m-%d') - INTERVAL 1 DAY  

查询必须汇总上月最后一天的所有金额类型查询必须汇总上月最后一天的所有金额类型您接近答案,但我发现如果翻译为ilegal,则返回NULL,但感谢您的帮助。您接近答案,但我发现如果翻译为ilegal,则返回NULL,但谢谢你的帮助。很高兴我能帮忙!:D@ThanatosSama我只是注意到你几乎得到了正确的答案。在第二次尝试中,如果将where子句的第二个条件更改为
day(last_day(date_amount))
,则得到
null
,这同样有效。您变为null的原因是因为last_day返回的日期不等于
day
返回的日期(整数)。哦,伙计,很抱歉,我没有注意到您写了@date,我不想只键入月份和年份。@ThanatosSama,正如我在评论中解释的,我已经更改了答案以反映这些更改,现在您不需要输入日期。现在这应该是一个可以接受的答案;)很高兴我能帮忙!:D@ThanatosSama我只是注意到你几乎得到了正确的答案。在第二次尝试中,如果将where子句的第二个条件更改为
day(last_day(date_amount))
,则得到
null
,这同样有效。您变为null的原因是因为last_day返回的日期不等于
day
返回的日期(整数)。哦,伙计,很抱歉,我没有注意到您写了@date,我不想只键入月份和年份。@ThanatosSama,正如我在评论中解释的,我已经更改了答案以反映这些更改,现在您不需要输入日期。现在这应该是一个可以接受的答案;)