项目中目前已有一周表存储了一年中所有的假日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,需要下面几个假设。 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按工作日查询统计优化_工作日计算问题思路和实现相关推荐

  1. 读薄《高性能MySql》(四)查询性能优化

    读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...

  2. mysql报表统计 优化_关于SQL调优与报表的性能优化

    前一段时间做了某产品实时统计的报表,这周在对报表性能进行优化. 其中逐步积累了一些优化经验,总结一下记录下来,欢迎大家一起探讨. 本文仅限于探讨单个数据库的查询sql及统计报表调优,不涉及分布式数据库 ...

  3. mysql 多表联查语句优化_?多表联合查询SQL语句优化

    11.27 多表联合查询的优化方式,优化后的SQL及分析 优化方式: 1.尽量不用'*' 2.小表作驱动 3.大表建索引 原本SQL语句: select * from order left join ...

  4. mysql笔记03 查询性能优化

    查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...

  5. mysql分页 disti_MySql查询性能优化

    慢查询判定 1.开启慢查询日志记录执行时间超过long_query_time 秒的sql语句 2.通过show processlist命令查看线程执行状态 3.通过explain解析sql了解执行状态 ...

  6. MySQL系列-- 4. 查询性能优化

    4. 查询性能优化 4.1 为什么查询速度会变慢 快速查询取决于响应时间 如果把查询看成是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消 ...

  7. MySQL数据库的红黑树优化_为什么Mysql用B+树做索引而不用B-树或红黑树

    B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数. 一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上. ...

  8. Mysql数据库分页查询及优化

    最近遇到个数据库分页查询问题,mysql数据库分页查询默认是升序查询,就是第一页查询的是最先插入的数据,最后一页才是最新插入的数据,弄了个小的数据库表单,记录下我的操作过程,还有优化查询速度的方法. ...

  9. MySQL多表查询核心优化

    概述 在一般的项目开发中,对数据表的多表查询是必不可少的.而对于存在大量数据量的情况时(例如百万级数据量),我们就需要从数据库的各个方面来进行优化,本文就先从多表查询开始.其他优化操作,后续另外更新, ...

最新文章

  1. Silverlight DataGrid超出列表高度时自动滚屏
  2. 面试再问值传递与引用传递,把这篇文章砸给他!
  3. leetcode 911. Online Election | 911. 在线选举(加强堆 + 二分查找)
  4. 知识工程.Vs.软件构架,框架,设计模式.
  5. 使用ADO.NET查询和操作数据
  6. 完整的可按年份和月份查询数据并显示
  7. 2020年10月DB-Engines排行:商业开源平分秋色 并驾齐驱四大天王
  8. 编程之美--高效率算出1的数目之扩展问题
  9. Python覆盖率分析工具_Coverage
  10. rabbitmq取消自动重连_RabbitMQ面试题
  11. Excel中阳历转阴历
  12. 学习pytorch中归一化transforms.Normalize
  13. 刘彬20000词汇05
  14. 通过跳绳瘦下来是一种怎么样的体验?
  15. 互联网医疗的定义及架构
  16. 【模板】FHQ Treap
  17. 题目:计算 1! + 2! + 3! + 4! +... + 10! 说明:4! 表示4的阶乘。4的阶乘是:1 * 2 * 3 * 4
  18. python基础之--人机大战,编程思维
  19. 【ESP32_8266_WiFi (二)】接入点模式、无线终端模式
  20. python.plt 画三维图像

热门文章

  1. kml用什么软件打开?
  2. 关于网线水晶头的接法详解
  3. 二级建造师学python有用_终于清楚python入门最好的教程
  4. [python复习8] 数据库mysql操作
  5. 干货 实例 | 数字化时代的传统行业转型升级
  6. 大厂Offer拿到手软啊!隔壁都馋哭了
  7. 华为#S系列交换机和E系列交换机基于IP网段配置限速
  8. 人工智能这么火,你知道是谁创立的吗?
  9. GBA火焰纹章改版-智慧的结晶
  10. 实时换脸技术——直播,视频通话|脸部交换程序