一个水表有停用/启用:计算当月真正使用的天数

news/2024/7/23 9:33:35 标签: sql, php, 算法

引言

水表是用于测量水消耗量的设备,对于水费计算非常重要。然而,在某些情况下,水表可能会被停用或重新启动,这对计算当月真正使用的天数带来了一些挑战。本文将探讨如何处理这种情况,以便准确计算水费。

背景

当水表被停用时,它不会记录任何数据。而当水表重新启动时,它将继续记录水的消耗量。因此,在计算当月真正使用的天数时,我们需要排除停用期间的数据。

解决方案

为了计算当月真正使用的天数,我们可以使用以下步骤:

下面是一个示例代码片段,用于演示如何计算当月真正使用的天数:

php">			$startDate = strtotime(date("Y-m-01"));
			$endDate = strtotime(date("Y-m-01")."+1 month");
			 //  计算最后一个状态
  			$lastStatus = TableStopLogModel::create()
                    ->where('date_time', $startDate, '<')
                    ->scalar("status") ?? 0;

            // 计算天数
            $logList = TableStopLogModel::create()
                ->where('date_time', $startDate, '>=')
                ->where('date_time', $endDate, '<')
                ->order('date_time', 'asc')->all();
            $stopDay = 0; // 停用天数
            $indexDate = $startDate;  // 1号开始
            $useDay = 0; // 使用天数
            //  10 为停用  20 为 启用
            foreach ($logList as $v) {
				// 这里可以合并优化, 为了方便查看分开
                if ($lastStatus == 0 && $v['status'] == 10) {  
                	// 当月之前没有记录,第一条记录是启用,则默认第一条记录之前为停用
                    $stopDay += abs(($v['date_time'] - $tempStartDate) / 86400);
                } else if ($lastStatus == 0 && $v['status'] == 10) { 
                	// 当月之前没有记录,第一条记录是停用,则默认第一条记录之前为启用
                    $useDay += abs(($v['date_time'] - $tempStartDate) / 86400);
                } else if ($v['status'] == 20 && $lastStatus == 10) { 
                	//  从停用 到启用,  则 停用日期增加
                    $stopDay += abs(($v['date_time'] - $tempStartDate) / 86400);
                } else if ($v['status'] == 10 && $lastStatus == 20) { 
                	 //  从启用到停用,  则 启动日期增加
                    $useDay += abs(($v['date_time'] - $tempStartDate) / 86400);
                }
                $indexDate = $v['date_time'];
                $lastStatus = $v['status'];
            }
            if ($lastStatus == 0){
                // 没有所有数据时 , 则自行判断视为当月默认启用还是停用
                
            }else if ($lastStatus == 20) { 
            	// 最后一条是启用 ,将当月最后的日期视为启用
                $useDay += abs(($endDate - $indexDate) / 86400);
            } else if ($lastStatus == 10) {
                //  最后一条是停用 ,将当月最后的日期视为停用
                $stopDay += abs(($endDate - $indexDate) / 86400);
            }
            var_dump("停用天数" . $userDay);
            var_dump("使用天数" . $tempUserDay);

http://www.niftyadmin.cn/n/1008173.html

相关文章

HBase(12):Java编程

1 需求与数据集 某某自来水公司,需要存储大量的缴费明细数据。以下截取了缴费明细的一部分内容。 用户id 姓名 用户地址 性别 缴费时间 表示数(本次) 表示数(上次)

python数据结构学习

1&#xff0c;列表 列表是python的一种可以更改数据内容的数据类型&#xff0c;它是由一系列的元素组成的序列。在其他的语言中&#xff0c;相似的功能称为数组&#xff0c;但是python的列表功能可以存储相同的数据类型外&#xff0c;还可以保存为不用的数据类型&#xff0c;这…

hive基于新浪微博的日志数据分析——项目及源码

有需要本项目的全套资源资源以及部署服务可以私信博主&#xff01;&#xff01;&#xff01; 本系统旨在对新浪微博日志进行大数据分析&#xff0c;探究用户行为、内容传播、移动设备等多个方面的特征和趋势&#xff0c;为企业和个人的营销策略、产品设计、用户服务等提供有益的…

GO web开发

go web开发 简介 go官方提供了http服务&#xff0c;但它的功能很简单。 这里介绍web开发中的一些问题&#xff0c;和web框架&#xff08;echo&#xff09;怎么解决这些问题 &#xff0c;对于具体的echo的使用&#xff0c;可看官网 官网&#xff1a; https://echo.labstack…

Java基础---有了基本类型为什么还需要包装类

目录 缘由 基本类型和包装类型的区别 如何理解自动拆装箱 哪些地方会自动拆装箱 自动拆装箱与缓存 缘由 Java中有8种基本数据类型&#xff0c;这些基本类型又都有对应的包装类 因为Java是一种面向对象语言&#xff0c;很多地方都需要使用对象而不是基本数据类型比如&…

Android中关于SharedPreference参数的问题

文章目录 一、前言二、问题背景三、问题定位四、问题解决 一、前言 在上周开发时遇到一个问题&#xff0c;记录一下&#xff1a; 首先描述一下应用场景&#xff1a; 使用sharedPreference进行存储&#xff0c;命名为a.xml&#xff0c;这里简称为a文件有两个服务&#xff0c;一…

H3C交换机在地址池下如何进行IP和MAC地址绑定

环境&#xff1a; H3C S6520-26Q-SI version 7.1.070, Release 6326 问题描述&#xff1a; H3C交换机在地址池下如何进行IP和MAC地址绑定 将MAC地址为0000-e03f-0305的PC机与IP地址10.1.1.1绑定&#xff0c;掩码为255.255.255.0 解决方案&#xff1a; 1.进入地址池视图 …

Spring复习:(2)AbstractAutowireCapableBeanFactory构造方法中的三个aware接口

public AbstractAutowireCapableBeanFactory() {super();ignoreDependencyInterface(BeanNameAware.class);ignoreDependencyInterface(BeanFactoryAware.class);ignoreDependencyInterface(BeanClassLoaderAware.class);}BeanNameAware接口用来让容器将bean的名字传到bean中去…