## 获取两个时间之间的间距时间

$s = '2017-02-05';
$e = '2017-07-20';
$start    = new \DateTime($s);
$end = new \DateTime($e);
// 时间间距 这里设置的是一个月
$interval = \DateInterval::createFromDateString('1 month');
$period = new \DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
echo $dt->format("Y-m") . "<br>\n";
}

输出结果:

-
-
-
-

获取头部和尾部的时间范围:

有时候会遇到这样一个场景如:

存在两行表:

  1. 月度考情表(记录每个员工一个月的考勤)

  2. 日度考勤表(记录每个员工每一天的考勤)

这时候有一个需求是这样的:

查询 “2017-02-05” —— “2017-012-20”

这之间的员工的考勤数据。

一般情况下会这么做,直接 根据时间筛选日度考勤表。结果是没问题的,但是试想一下,如果有2000个员工,每天的考勤, 那一年是不是  73W的数据了,如果两年呢? 加上做一些其他的操作,是不是效率很慢?

这个时候可以查询 “2017-02-05” —— “2017-012-20” 两个日期时间的完整月份也就是 2017-03,2017-04,2017-05..以此类推

剩下的不完整日期再拿出来 筛选日度考勤表,那么筛选的量会大大降低。

以下是获取不完整日期的代码:

$s = '2017-02-05';
$e = '2017-07-20'; // 获取头部的时间范围
if (date('j', strtotime($s)) > 1) {
$start_day_head = date('Y-m-01', strtotime($s));
$end_day_head = date('Y-m-t', strtotime($s));
$s = date('Y-m-01', strtotime("+1 months", strtotime($s)));
} // 获取尾部的时间范围
if (date('j', strtotime($e)) > 1) {
$start_day_tail = date('Y-m-01', strtotime($e));
$end_day_tail = date('Y-m-t', strtotime($e));
$e = date('Y-m-t', strtotime("-1 months", strtotime($e)));
}

PHP 获取两个时间之间的月份的更多相关文章

  1. oracle 计算两个时间之间的月份差,相差几个星期,相差多少天

    相差多少天:   sysdate-to_date('1991-01-01','YYYY-MM-DD'))<7 and (sysdate-to_date('1991=01=01','YYYY-MM ...

  2. 获取两个时间节点的月份列表&&每个月份的开始时间及结束时间

    //Q:从今天起之前五个月的列表 date_default_timezone_set('PRC'); $time=strtotime('-5 month'); //包含本月 $begin = strt ...

  3. JS 格式化时间(获取两个日期之间的每一天、每一月、每半小时、每一秒)

    时间戳转换为时间 // 时间戳转换为时间 function timestampToTime(timestamp, isMs = true) { const date = new Date(timest ...

  4. C# 获取两个时间段之间的所有时间与获取当前时间所在的季度开始和结束时间

    一:C# 获取两个时间段之间的所有时间 public List<string> GetTimeList(string rq1, string rq2) { List<string&g ...

  5. Java 获取两个日期之间的日期

    1.前期需求,两个日期,我们叫他startDate和endDate,然后获取到两个日期之间的日期 /** * 获取两个日期之间的日期 * @param start 开始日期 * @param end ...

  6. java中获取两个时间中的每一天

    引入下面方法即可: /** * 获取两个时间中的每一天 * @param bigtimeStr 开始时间 yyyy-MM-dd * @param endTimeStr 结束时间 yyyy-MM-dd ...

  7. java 获取两个日期之间的所有日期(年月日)

    前言:直接上代码 java 获取两个日期之间的所有日期(年月日) /** * 获取两个日期之间的日期,包括开始结束日期 * @param start 开始日期 * @param end 结束日期 * ...

  8. java获取两个日期之间的所有日期

    java获取两个日期之间的所有日期   解决方法: 1.核心方法 private List<String> getBetweenDates(String start, String end ...

  9. MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

    MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数 计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数,这里主要分享的是通过MySql内置的函数 TimeStampDiff() ...

随机推荐

  1. [Oracle]ORA-14400:插入的分区关键字未映射到任何分区

    今天在使用测试库的时候发生ORA-14400:inserted partition key does not map to any partition 解决过程: 经过百度,发现出现ORA-14400 ...

  2. setInterval与setTimeout 的区别

    setInterval在执行完一次代码之后,经过了那个固定的时间间隔,它还会自动重复执行代码,而setTimeout只执行一次那段代码     用法: setInterval("alert( ...

  3. 687. Longest Univalue Path

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  4. Mathematics | Mean, Variance and Standard Deviation

    Mean is average of a given set of data. Let us consider below example These eight data points have t ...

  5. window.frames

    // 点击事件 function zTreeOnClick(event, treeId, treeNode) { id = treeNode.id; window.frames["treeF ...

  6. 解决css3不支持同时缩放和旋转的办法

    设置两个div,外层scale,内层rotate.

  7. react创建项目报错unexpected end of json while parsing near xxx

    报这个错,执行下面的命令,然后重新创建项目就可以. npm cache clean --force

  8. lf-8.4 数据的增删改

    MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 ...

  9. understand试用笔记一阅读VS2010项目

    一.查看vs2010项目 打开understand,File—New—Project...—Next—Next [向导第三步,选“Import Visual Sudio project files”] ...

  10. C# 编码标准(二)

    先八卦一下,昨天写了C# 编码标准(一),得到了@h82258652的补充,感到非常欣慰,一是感觉他的观点扩展了我的视野,丰富了我的看法,所以更坚定了我继续写博客的想法,由于是五笔打字,经常不写东西, ...