mysql按工作日查询统计优化_工作日计算问题思路和实现
项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,需要下面几个假设。 1. 不考虑周六周日,将其视作普通工作日 2. 假日没有交叠情况,不会出现10月1日到7日是国庆节,其中又有
项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,需要下面几个假设。
1. 不考虑周六周日,将其视作普通工作日
2. 假日没有交叠情况,不会出现10月1日到7日是国庆节,其中又有一个其它的节日
给出假日表的设计,某个假日都有起始时间和结束时间,这里只取月日,这样就能表示每一年的假日。
CREATE TABLE [dbo].[holiday](
[begin_time] [varchar](50) NULL,
[end_time] [varchar](50) NULL
) ON [PRIMARY]
GO
插入测试数据,例如插入国庆节的假日
给定查询时间段为从2014-09-30至2014-10-08,这期间的工作日
declare @query_begin datetime --查询起始时间
declare @query_end datetime --查询结束时间
declare @year1 int
declare @year2 int
declare @yeartemp int
declare @total_holidays int
set @query_begin = '2014-09-01'
set @query_end = '2015-01-31'
set @year1 = YEAR(@query_begin)
set @year2 = YEAR(@query_end)
--存储所有的含有年月日的假期
IF object_id('tempdb..#temp') is not null
BEGIN
drop table #temp
END
CREATE table #temp
(
begin_time date,
end_time date,
)
insert into #temp
select convert(varchar(4),@year1)+'-'+begin_time, convert(varchar(4),@year1)+'-'+end_time
from holiday
--这里主要考虑查询时间段跨年的情况
set @yeartemp=@year1+1
while @yeartemp<=@year2
begin
insert into #temp
select convert(varchar(4),@yeartemp)+'-'+begin_time, convert(varchar(4),@yeartemp)+'-'+end_time
from holiday
set @yeartemp=@yeartemp+1
end
--去掉和查询时间段没有一点交集的假日段
delete from #temp
where end_time@query_end
select @total_holidays= SUM(DATEDIFF(dd,begin_time,end_time)+1)
from
(
select case when begin_time@query_end then @query_end else end_time end as end_time from #temp
) t
select DATEDIFF(DD,@query_begin,@query_end)+1-@total_holidays
drop table #temp
执行该脚本就可以得到结果是2,符合预期。下面给出一些特殊测试用例,验证脚本是否能正确计算工作日。
1. 查询时间为2014-10-05至2014-10-08
结果:1
2. 查询时间为2014-09-30至2014-10-07
结果:1
3. 增加一条假日,例如是教师节,查询时间段为2014-09-01至2014-10-08
结果:30
4. 在增加一条假日记录,元旦,查询时间段为2014-09-01至2015-01-31
现在holiday表的记录为:
如果手动去算就是:30+31+30+31+31-7-1-1=144
实际结果:144
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
mysql按工作日查询统计优化_工作日计算问题思路和实现相关推荐
- 读薄《高性能MySql》(四)查询性能优化
读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...
- mysql报表统计 优化_关于SQL调优与报表的性能优化
前一段时间做了某产品实时统计的报表,这周在对报表性能进行优化. 其中逐步积累了一些优化经验,总结一下记录下来,欢迎大家一起探讨. 本文仅限于探讨单个数据库的查询sql及统计报表调优,不涉及分布式数据库 ...
- mysql 多表联查语句优化_?多表联合查询SQL语句优化
11.27 多表联合查询的优化方式,优化后的SQL及分析 优化方式: 1.尽量不用'*' 2.小表作驱动 3.大表建索引 原本SQL语句: select * from order left join ...
- mysql笔记03 查询性能优化
查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...
- mysql分页 disti_MySql查询性能优化
慢查询判定 1.开启慢查询日志记录执行时间超过long_query_time 秒的sql语句 2.通过show processlist命令查看线程执行状态 3.通过explain解析sql了解执行状态 ...
- MySQL系列-- 4. 查询性能优化
4. 查询性能优化 4.1 为什么查询速度会变慢 快速查询取决于响应时间 如果把查询看成是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消 ...
- MySQL数据库的红黑树优化_为什么Mysql用B+树做索引而不用B-树或红黑树
B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数. 一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上. ...
- Mysql数据库分页查询及优化
最近遇到个数据库分页查询问题,mysql数据库分页查询默认是升序查询,就是第一页查询的是最先插入的数据,最后一页才是最新插入的数据,弄了个小的数据库表单,记录下我的操作过程,还有优化查询速度的方法. ...
- MySQL多表查询核心优化
概述 在一般的项目开发中,对数据表的多表查询是必不可少的.而对于存在大量数据量的情况时(例如百万级数据量),我们就需要从数据库的各个方面来进行优化,本文就先从多表查询开始.其他优化操作,后续另外更新, ...
最新文章
- Silverlight DataGrid超出列表高度时自动滚屏
- 面试再问值传递与引用传递,把这篇文章砸给他!
- leetcode 911. Online Election | 911. 在线选举(加强堆 + 二分查找)
- 知识工程.Vs.软件构架,框架,设计模式.
- 使用ADO.NET查询和操作数据
- 完整的可按年份和月份查询数据并显示
- 2020年10月DB-Engines排行:商业开源平分秋色 并驾齐驱四大天王
- 编程之美--高效率算出1的数目之扩展问题
- Python覆盖率分析工具_Coverage
- rabbitmq取消自动重连_RabbitMQ面试题
- Excel中阳历转阴历
- 学习pytorch中归一化transforms.Normalize
- 刘彬20000词汇05
- 通过跳绳瘦下来是一种怎么样的体验?
- 互联网医疗的定义及架构
- 【模板】FHQ Treap
- 题目:计算 1! + 2! + 3! + 4! +... + 10! 说明:4! 表示4的阶乘。4的阶乘是:1 * 2 * 3 * 4
- python基础之--人机大战,编程思维
- 【ESP32_8266_WiFi (二)】接入点模式、无线终端模式
- python.plt 画三维图像