QT计算两个日期之间的月份数

        数据库中单表数据存储量过大时,会造成数据库的查询统计速度变慢,因此需将单表数据拆分存储到按年月命名的多张数据表中。解决思路是获取单表中的最小时间和最大时间,然后计算两个时间中的月份数量,最后根据开始年月循环算出所有需要拆分的年月名称,生成对应的数据表名,并将对应年月的数据存储到多张数据表中。

        计算两个日期之间的相关函数如下:

// 计算两个日期之间的月份数
int Tools::MonthsBetween2Date(QString date1, QString date2)                                                             //主调函数
{                                                                                                                        //取出日期中的年月日
    int year1, month1, day1;
    int year2, month2, day2;
    QString datelast,datenow;
    datelast=date1;
    datenow=date2;
    QRegExp exp("[年月日-:-: ]");
    datelast =datelast.replace(exp,"");
    datenow =datenow.replace(exp,"");
    qDebug()<<datelast;
    qDebug()<<datenow;
    if(datenow<datelast)
    {
        return -1;
    }
    if(!StringToDate(datelast, year1, month1, day1) || !StringToDate(datenow, year2,month2,day2))                           //调用截取函数
    {
        return -1;                     //如果截取信息失败,那么将返回-1
    }
    if(year1 == year2)                 //如果年份相同,则返回月份相减数据
    {
        if(month1 == month2)
        {
            return 0;
        }
        else
        {
            return month1 > month2 ? month1 - month2 : month2 - month1;
        }
    }
    else                                                   //如果年份不同,则重新计算
    {
        if(year1 > year2)                                  //如果前方数据大于后方,这调换这两数据
        {
            swap(year1, year2);                            //按亦或算法交换两个数
            swap(month1, month2);
            swap(day1, day2);
        }
        int m1 = MonthInYear(month1);
        int m2 = 12 - MonthInYear(month2) + 1;
        int m3 = 0;
        for(int year = year1 + 1; year < year2; year++)
        {
            for(int k = month1; k <= 12; k++)
            {
                m3 += 1;
            }
        }
        return m1 + m2 + m3;
    }
}
//字符串转年月日
bool Tools::StringToDate(QString date ,int& year, int& month, int& day)            //数据解析
{
    year = date.mid(0,4).toInt();                                                   //数据截取
    month = date.mid(4,2).toInt();                                                  //数据截取
    day = date.mid(6,2).toInt();                                                    //数据截取

    int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};                              //初始化12个月份的数据
    if(IsLeap(year))                                                                //如果是闰年,那么将2月的数据更新为29天
    {
        DAY[1] = 29;
    }
    return year >= 0 && month<=12 && month>0 && day<=DAY[month-1] && day>0;         //年天算法,判断数据解析是否符合日期规格
}
//判断是否是闰年
bool Tools::IsLeap(int year)
{
    return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);                     //判断是否是润年
}
//计算一年中的剩余月份数量
int Tools::MonthInYear(int month)
{
    int intMonth = 0;
    for(int k = month; k <= 12; k++)
    {
        intMonth += 1;
    }
    return intMonth;
}
//交换两个数
void Tools::swap(int a,int b)
{
    a=a^b;
    b=a^b;
    a=a^b;
}

      举例:开始时间为2023-01-01 00:00:00,结束时间为2024-03-04 08:30:00,调用代码

QString date1 = "2023-01-01 00:00:00";
QString date2 = "2024-03-04 08:30:00";
int TotalMonth = MonthsBetween2Date(date1, date2);

  计算的出来的月份数量为15个月。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/432790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙系列四:开源蓝牙协议BTStack框架分析

在学习蓝牙的时候,最好还是要借助源代码来学习,并且进行实际的操作从而更加理解蓝牙协议栈的运行。依然根据韦东山老师的学习视频进行学习,整理记录如下。 首先,协议栈是跑在硬件上的,我们这里选择使用windows来操控硬件。来看一下硬件的结构: 蓝牙模块接在电脑上,或是…

(每日持续更新)jdk api之PipedWriter基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

设置word目录从正文开始记录页码,并解决word目录正常,但正文页脚处只显示第一页的页码

设置word目录从正文开始记录页码&#xff0c;并解决word目录正常&#xff0c;但正文页脚处只显示第一页的页码 问题详情1&#xff1a;如何设置目录从正文开始记录页码 问题详情2&#xff1a;word目录处的页码正常&#xff0c;但正文只有第一页的页脚处显示页码 解决方法 在设置…

web开发:如何用Echarts来自动给网页设计各种统计图

很多时候web开发也会需要用到统计图&#xff0c;如果单纯靠我们自己那点拙劣的css和js水平设计的话&#xff0c;又耗时间又做得跟史一样&#xff0c;这时候就需要引入别人设计师为我们设计好的动态统计图——echarts Echarts的官网是&#xff1a;Apache ECharts 1、第一步&…

稀碎从零算法笔记Day4-LeetCode:交替合并字符串

前言&#xff1a;今天妹有深夜档&#xff0c;因为8点有个飞机 题型&#xff1a;字符串、双指针&#xff08;笔者没用这个思路&#xff09; 链接&#xff1a;1768. 交替合并字符串 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 著作权归作者所有。商业转…

时钟域交叉设计——Clock Domain Crossing Design

What is Metastability? 任何关于时钟域交叉&#xff08;CDC&#xff09;的讨论&#xff0c;都应从对可变性和同步性的基本了解开始。通俗地说&#xff0c;可变性是指一种不稳定的中间状态&#xff0c;在这种状态下&#xff0c;最轻微的干扰也会导致稳定状态的恢复。当应用于…

QT----QTcreater连接Mysql数据库

目录 1、下载驱动&#xff0c;放入文件夹2、编写代码&#xff0c;实现本地访问3、实现网络数据库3.1 更改权限3.2 修改代码 之前写了一个图书管理系统用的是sqlite3&#xff0c;现在想用mysql&#xff0c;部署到网上&#xff0c;实现远程访问。 1、下载驱动&#xff0c;放入文…

Draft-P802.11be-D3.2协议学习__$Annex-Z-HE-SIG-B-and-EHT-SIG-content-examples

Draft-P802.11be-D3.2协议学习__$Annex-Z-HE-SIG-B-and-EHT-SIG-content-examples Z.1 GeneralZ.2 HE-SIG-B example 1Z.3 HE-SIG-B example 2Z.4 HE-SIG-B example 3Z.5 HE-SIG-B example 4Z.6 EHT-SIG example 1&#xff08;EHT OFDMA 80MHz&#xff09;Z.7 EHT-SIG example …

虚假交易商常态化,2月下半月FX110曝光43家黑平台

以半个月为期&#xff0c;FX110网对虚假交易商进行常态化曝光&#xff0c;只为极力打压黑平台生存空间&#xff0c;让更多人的避免被骗。 2月上半月&#xff0c;FX110网曝光黑平台41家&#xff0c;下半月曝光数与上半月基本持平&#xff0c;为43家。 曝光的这43家黑平台绝大部…

Win UI3开发笔记(四)设置主题续2

本机深色主题下设置的背景颜色可以作用于整个对话框&#xff0c;本机浅色模式下设置的背景颜色只作用与下边的部分。 如果本机选深色&#xff0c;程序选浅色&#xff0c;设置为light只对上部分管用&#xff0c;下部分不管用。如图&#xff0c;左边那个hello按钮要看不见了。。…

LeetCode:1976. 到达目的地的方案数(spfa + 记忆化 Java)

目录 1976. 到达目的地的方案数 原题链接 题目描述&#xff1a; 实现代码与解析&#xff1a; spfa 记忆化 原理思路&#xff1a; 1976. 到达目的地的方案数 原题链接 1976. 到达目的地的方案数 题目描述&#xff1a; 你在一个城市里&#xff0c;城市由 n 个路口组成&a…

RabbitMQ 高级

在昨天的练习作业中&#xff0c;我们改造了余额支付功能&#xff0c;在支付成功后利用RabbitMQ通知交易服务&#xff0c;更新业务订单状态为已支付。 但是大家思考一下&#xff0c;如果这里MQ通知失败&#xff0c;支付服务中支付流水显示支付成功&#xff0c;而交易服务中的订单…

【mogoose】对查询的数据进行过滤后不需要展示的信息

数据库结构如下 我只要email userName sex role 几个数据&#xff0c;其余不要 {_id: new ObjectId(65e7b6df8d06a0623fa899f5),email: 12345qq.com,pwd: $2a$10$eLJ9skKEsQxvzHf5X8hbaOXKtg8GCHBeieieSN6Usu17D2DPaI44i,userName: 默认昵称0769,sex: 0,token: {upCount: 0,_…

『python爬虫』ip代理池使用 协采云 账密模式(保姆级图文)

目录 实现效果实现思路代码示例总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 实现效果 在官网原版demo基础上小改了一下,修正了接口错误(把2023改成2024就可以了),原版demo只能测试单个ip,我这里批量测试所有…

探索设计模式的魅力:深入解析解释器模式-学习、实现与高效使用的全指南

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并且坚持默默的做事。 探索设计模式的魅力&#xff1a;解析解释器模式学习、实现与高效使用全指南 文章目录 一、案…

maven中dependencyManagement

如果所在pom中dependency引入的依赖没有指定版本号&#xff0c;会以pom中dependencyManagement所制定的版本号为准吗 是的&#xff0c;如果在项目的 <dependency> 元素中没有指定版本号&#xff0c;而且该依赖在 <dependencyManagement> 中有指定版本号&#xff0…

如何从 WordPress 中的静态资源中删除查询字符串

今天有一个客户来问询&#xff0c;hostease主机创建的WordPress站点&#xff0c;在GTMetrix或Pingdom进行网站速度测试&#xff0c;看到有关查询字符串的警告。如果不想看到查询字符串的警告&#xff0c;要如何处理呢?我们测试&#xff0c;可以通过一些处理满足这个需求。我们…

multiprocessing Event实现中断进程或程序

参考&#xff1a;https://www.cnblogs.com/MoKinLi/p/17931515.html import multiprocessing import timedef worker(event, value):while True:# 检查事件是否被设置if event.is_set():# 事件被设置&#xff0c;中断程序break# 模拟工作time.sleep(1)print(f"Working: {…

DataGrip 连接 Centos MySql失败

首先检查Mysql是否运行&#xff1a; systemctl status mysqld &#xff0c; 如果显示没有启动则需要启动mysql 检查防火墙是否打开&#xff0c;是否打开3306的端口 sudo firewall-cmd --list-all 如果下面3306没有打开则打开3306端口 publictarget: defaulticmp-block-inver…

消防监督业务比武竞赛活动方案

为检验各级消防救援机构消防监督业务大练兵成效&#xff0c;根据总队防火业务练兵活动总体部署&#xff0c;决定举办“云岭蓝盾”杯消防监督业务比武竞赛&#xff0c;方案如下&#xff1a; 决赛设置打铁还需自身硬、实践真知显担当、鱼跃龙门展风采3个环节。利用比武竞赛平台设…