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有金额,那么我们可以获取此用户,否则不会