php上周时间范围,php月周时间范围筛选查询的注意事项 - 翟码农技术博客

现有一个业务数据表栏目大概如下所示:id int 记录id

group_id int 分组id

income int 收入

expense int 开支

month_date date 月份时间,例如:2019-12-01

week int 第几周

我要实现的是获取某小组在任意时间范围之间的收入、开支及利润统计。

由于数据是按某月第几周的方式来新增的,而筛选的时间选择是年-月-日的方式,所以筛选时间的条件必须先由年-月-日格式转为某月几周的形式。这个转换过程本文就不讲述了。

我们就直接看,两个某月某周格式的时间范围,统计是如何实现的。

用的是laravel框架,本人一开始写的代码如下:$startMonth = '2019-11-01';

$startWeek= 2;

$endMonth = '2019-12-01';

$endWeek= 2;

$query = Finance::where(function($outQuery) use($startMonth, $startWeek, $endMonth, $endWeek){

$outQuery->orWhere(function($query) use($startMonth, $startWeek){

$query->where('month_date', $startMonth)

->where('week', '>=', $startWeek);

})

->orWhere(function($query) use($startMonth, $endMonth){

$query->where('month_date', '>', $startMonth)

->where('month_date', '

})

->orWhere(function($query) use($$endMonth, $endWeek){

$query->where('month_date', $endMonth)

->where('week', '<=', $endWeek);

});

});

上面代码逻辑有漏洞,你能看出来吗?

将上面代码转换成sql语句,如下:select * from zhai14_cost

where group_id = ?

and (

(date_time = ? and week >= ?)

or (date_time > ? and date_time < ?)

or (date_time=? and week <=?)

)

你还能看出来问题吗?

特殊情形是,当开始时间和结束都是同一个月同一周的时候,应该实现的功能就是查询那一个月那一周的数据。但是上面代码并不能达到这一目的。

为了方便分析,我们假定时间都是11月的第3周。

将数值代入到上面sql语句中去,得到如下:(date_time = '2019-11-01' and week >= 3)

or (date_time > '2019-11-01' and date_time < '2019-11-01')

or (date_time='2019-11-01' and week <=3)

中间一行是空区间,就可以忽略了。

剩下第一行和第三行所形成的范围就成了2019-11-01这整个月的时间了,而实际应该就只是2019年11月的第3周这一周的时间而已。

这就是上面代码的漏洞所在。

修补方法就是将开始时间和结束时间相等的情形考虑进去,最终代码如下所示:if( $startMonth == $endMonth ){

if( $startWeek == $endWeek ){

$query = Finance::where('month_date', $startMonth)

->where('week', $startWeek);

}else{

$query = Finance::where('month_date', $startMonth)

->where('week', '>=', $startWeek)

->where('week', '<=', $endWeek);

}

}else{

$query = Finance::where(function($outQuery) use($startMonth, $startWeek, $endMonth, $endWeek){

$outQuery->orWhere(function($query) use($startMonth, $startWeek){

$query->where('month_date', $startMonth)

->where('week', '>=', $startWeek);

})

->orWhere(function($query) use($startMonth, $endMonth){

$query->where('month_date', '>', $startMonth)

->where('month_date', '

})

->orWhere(function($query) use($$endMonth, $endWeek){

$query->where('month_date', $endMonth)

->where('week', '<=', $endWeek);

});

});

}

2019年12月07日 19:31文章创建

2019年12月07日 20:51文章发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stream流是Java 8引入的一种新的数据处理方式,它提供了一种更简洁、更灵活的方式来处理集合数据。在stream流中,可以使用各种操作来对数据进行筛选、转换、聚合等操作。 要进行时间比较筛选,可以使用stream流的filter操作来实现。首先,需要将时间作为一个属性存储在对象中,然后使用filter操作来筛选符合条件的对象。 下面是一个示例代码,演示如何使用stream流进行时间比较筛选: ```java import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // 创建一个包含时间属性的对象列表 List<Event> events = new ArrayList<>(); events.add(new Event("Event 1", LocalDateTime.of(2022, 1, 1, 10, 0))); events.add(new Event("Event 2", LocalDateTime.of(2022, 1, 2, 12, 0))); events.add(new Event("Event 3", LocalDateTime.of(2022, 1, 3, 14, 0))); // 使用stream流进行时间比较筛选 LocalDateTime targetTime = LocalDateTime.of(2022, 1, 2, 0, 0); List<Event> filteredEvents = events.stream() .filter(event -> event.getTime().isAfter(targetTime)) .toList(); // 输出筛选结果 for (Event event : filteredEvents) { System.out.println(event.getName()); } } } class Event { private String name; private LocalDateTime time; public Event(String name, LocalDateTime time) { this.name = name; this.time = time; } public String getName() { return name; } public LocalDateTime getTime() { return time; } } ``` 在上述代码中,我们创建了一个包含时间属性的Event对象列表,并使用stream流的filter操作筛选时间晚于目标时间的事件。最后,输出筛选结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值