用SQL计算差异

时间:2013-07-14 15:42:05

标签: mysql date delta

我已经对这个主题进行了一段时间的研究,并且由于在另一个主题中发布了解决方案,我接近解决了这个问题。

我试图在一列数据中获取更改:row(n) - row(n-1)

update Table tt1 
left outer JOIN Table tt2 
on tt1.name = tt2.name 
and tt1.date-tt2.date=1 
set tt1.delta = (tt1.amount-ifnull(tt2.amount, tt1.amount));

输出

Date      |    Value   |    Delta
2013-03-30|    38651   |   393
2013-03-31|    39035   |   384
2013-04-01|    39459   |   0
2013-04-02|    39806   |   347

正如您所看到的,差异不计算4月1日(其余值都很好)。同样的情况发生在每个月的第一天。

我的猜测是与[和tt1.date-tt2.date = 1]有关,但我无法弄明白究竟是什么。

提前感谢您的所有帮助!

3 个答案:

答案 0 :(得分:0)

尝试DATEDIFF这将为您提供两个日期之间的差异。

  and  DATEDIFF(tt1.date,tt2.date) =1 

这是因为你与01-31不同而且这不正确就是为什么你得到0

因此你也应该在一个月内进行辩护。

答案 1 :(得分:0)

一个猜测是日期不会存储为date,而是有一个时间组件。您可以使用date或使用date()转换为datediff()来解决此问题:

update Table tt1 left outer JOIN
       Table tt2 
       on tt1.name = tt2.name and datediff(tt1.date, tt2.date) = 1 
    set tt1.delta = (tt1.amount-ifnull(tt2.amount, tt1.amount));

答案 2 :(得分:0)

我对你的陈述做了一些修改......你的错误要么是处理日期的方式,要么是你处理delta的方式......

update Table tt1 
left outer JOIN Table tt2 
on tt1.name = tt2.name 
and tt1.date = date_sub(tt2.date, interval 1 day)    
set tt1.delta = case when tt2.amount is not null then tt1.amount - tt2.amount else -1 end;