Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从两个不同的日期获取数据并进行比较_Php_Mysql_Sql - Fatal编程技术网

Php 从两个不同的日期获取数据并进行比较

Php 从两个不同的日期获取数据并进行比较,php,mysql,sql,Php,Mysql,Sql,我有个问题。我在数组中有这些数据: id idm amount date 1 5 10 2017-08-23 12:12:12 2 5 20 2017-08-23 12:14:16 3 6 13 2017-08-23 18:00:00 4 5 25

我有个问题。我在数组中有这些数据:

id      idm         amount           date
1        5          10              2017-08-23 12:12:12
2        5          20              2017-08-23 12:14:16
3        6          13              2017-08-23 18:00:00
4        5          25              2017-08-24 19:00:00
5        5          160             2017-08-24 19:30:00
因此,我们的想法是从日期
2017-08-23
获得金额的总和,并与日期
2017-08-24
进行比较。如果用户的这两个值之间的差值大于20,例如,在本例中,我找到了一个用户

我的建议是创建两个sql:

select sum(amount) as previous_amount, idm 
FROM table
WHERE date >= '2017-08-23 00:00:00' AND date <= '2017-08-23 23:59:59' 
GROUP By idm

select sum(amount) as actual_amount, idm 
FROM table
WHERE date >= '2017-08-24 00:00:00' AND date <= '2017-08-24 23:59:59' 
GROUP By idm
选择sum(amount)作为上一个金额,idm
从桌子上

其中日期>='2017-08-23 00:00:00'和日期='2017-08-24 00:00:00'和日期未测试,但这可能有效

select (sum(b.amount) - sum(a.amount)) as result, idm
from table a join table b on a.idm = b.idm
where a.date = date('2017-08-23') and b.date = date('2017-08-24')
group by idm

如果你能提供一个可能帮助我们的提琴来帮助你。

试试看,应该比@Shuddh解决方案快,因为它不依赖连接

SELECT 
  idm,
  sum(IF(date(`date`) = '2017-08-23', amount, 0)) as amountDay1,
  sum(IF(date(`date`) = '2017-08-24', amount, 0)) as amountDay1,

  sum(IF(date(`date`) = '2017-08-23', amount, 0)) 
  - sum(IF(date(`date`) = '2017-08-24', amount, 0)) as diffDay1Day2
FROM 
  table
GROUP BY
  idm

如果我理解正确,这就是你想要的:

select 
idm,
sum(case when date >= '2017-08-23 00:00:00' AND date <= '2017-08-23 23:59:59' then amount end)  -
sum(case when date >= '2017-08-24 00:00:00' AND date <= '2017-08-24 23:59:59' then amount end)  as diff
from your_table
group by idm
having diff not between -20 and 20
选择
idm,

求和(当日期>='2017-08-23 00:00:00'和日期='2017-08-24 00:00:00'和日期时,我的方法是计算每个
idm
天的差异(我将向您展示如何计算)然后在代码中完成其余部分。看第一部分,我使用
datetime
操作函数从datetime值中删除time元素,该值将日期仅保留为字符串。这是我们现在可以分组的内容:

select sum(amount) as previous_amount, idm, DATE_FORMAT(`date`, '%Y-%m-%d') as day 
FROM test
GROUP By idm, day
order by idm, day
这将为您提供如下信息:

previous_amount idm day
30              5   2017-08-23
185             5   2017-08-24
13              6   2017-08-23
此时,我将继续编写代码。但是,如果要在数据库中执行此操作,则需要在其自身上加入上述结果表。这模拟了滞后/超前行为(两条Oracle指令在MySQL中不可用)。因此,查询为:

select 
    diff1.idm, 
    previous_amount, 
    actual_amount, 
    diff2.actual_amount-diff1.previous_amount as difference, 
    diff1.day as from_day, 
    diff2.day as to_day
from (
  select sum(amount) as previous_amount, idm, DATE_FORMAT(`date`, '%Y-%m-%d') as day 
  FROM test
  GROUP By idm, day
  order by idm, day
) as diff1
left join (
  select sum(amount) as actual_amount, idm, DATE_FORMAT(`date`, '%Y-%m-%d') as day 
  FROM test
  GROUP By idm, day
  order by idm, day
) as diff2 on diff1.idm=diff2.idm
where DATE(diff2.day) > DATE(diff1.day) 
  and diff2.actual_amount-diff1.previous_amount > 20;
上述结果如下所示:

idm previous_amount actual_amount   difference  from_day    to_day
5   30              185             155         2017-08-23  2017-08-24
请注意,上面的查询保证day2>day1,但不强制执行一天唯一的差异。但是,我认为它可以很容易地进行扩展

这里

更新#1


如果您想保证单日差异,则将
where
条件替换为
TIMESTAMPDIFF(day,diff1.day,diff2.day)=1

样本数据的预期输出是什么?
idm
差异
如果大于20,那么每个
idm
的20个差异是什么?您能显示预期结果吗?(即对于
idm=6
只有一个条目,因此您希望没有差异?)是@urban difference per idm这只是给你一个提示,让你走上正确的方向。你可以用that@Benvorth我使用了join,这样就可以忽略idm只存在于任何一个日期的情况。我们能否只获得在这两个日期都有数据的用户,我的意思是,如果用户在2017-08-23和2017-08-24有金额,那么我们可以获取此用户,否则不会