最近公司OA系统的需求,实现一年中每个日期剔除节假日和星期天之后的五个日期是几号,每个日期都要跳过节假日和星期天,当时是真的慌了,郁闷了一天,后来半夜忽然来灵感,想想还是可以实现。

需要做一张节假日的表,存入一年中的法定节假日,然后用游标循环日期,星期天可以用datename函数剔除:datename(dw,日期)!='Sunday'

 1 ALTER PROCEDURE [dbo].[pc_Job_Insert_HolidayForUQ]
2 as
3 BEGIN TRY
4
5 --插入一年的日期
6 if not exists(select CONVERT(varchar(10),StartDate,23) as StartDate from [dbo].[HolidayForUQ] where year(StartDate)= year(getdate())+1)
7 begin
8 DECLARE @newdate varchar(4),@newdate1 varchar(4)
9 set @newdate=year(getdate())
10 set @newdate1=year(getdate())+1
11 insert into [dbo].[HolidayForUQ]
12 select convert(varchar(10),riqi,120),'','','','','',GETDATE() from(select riqi=dateadd(dd,number,@newdate+'-12-31') from master..spt_values where type='p'
13 and number between 1 and 366) a where datepart(yy,a.riqi)=@newdate1
14 end
15
16 --创建临时表
17 CREATE TABLE #tab_HolidayForUQ(
18 ID int identity(1,1),
19 StartDate varchar(10)
20 )
21
22 --剔除节假日和周日,插入临时表,可以得到ID
23 insert into #tab_HolidayForUQ select CONVERT(varchar(10),StartDate,23) as StartDate from [dbo].[HolidayForUQ] where datename(dw,StartDate)!='Sunday'
24 and StartDate not in(select convert(datetime,Holiday_Date,112) from vw_fmis_Holiday_3621 where Holiday_Date=StartDate)
25 order by StartDate asc
26
27
28 Declare @StartDate varchar(10) --定义循环的当前日期
29 DECLARE Menu CURSOR for
30 ---------
31 select CONVERT(varchar(10),StartDate,23) as StartDate from [dbo].[HolidayForUQ] --where StrandTime >='2022-01-01' --in('2018-10-01','2018-10-02')
32 --------
33 open Menu
34 FETCH NEXT FROM Menu into @StartDate
35 while @@FETCH_STATUS =0
36 BEGIN
37 ---------------------------------------------------------------------------------
38
39 --select HFID from [dbo].[HolidayForUQ]
40
41 DECLARE @IsID int,@starttime varchar(10),@addto1 datetime,@addto2 datetime,@addto3 datetime,@addto4 datetime,@addto5 datetime,@No1 int
42 --链接临时表
43 select @starttime=CONVERT(varchar(10),a.StartDate,23),@IsID=b.ID from [dbo].[HolidayForUQ] a left join #tab_HolidayForUQ b
44 on a.StartDate=b.StartDate where a.StartDate=@StartDate
45
46 --select CONVERT(varchar(10),a.StartDate,23) as StartDate,b.ID from [dbo].[HolidayForUQ] a left join #tab_HolidayForUQ b
47 --on a.StartDate=b.StartDate
48
49 if(@IsID is not null)--如果当前日期不是节假日或者周日,就根据剔除了节假日和周日临时表数据的自增ID去添加
50 begin
51 select @addto1=StartDate from #tab_HolidayForUQ where ID=@IsID+1
52 select @addto2=StartDate from #tab_HolidayForUQ where ID=@IsID+2
53 select @addto3=StartDate from #tab_HolidayForUQ where ID=@IsID+3
54 select @addto4=StartDate from #tab_HolidayForUQ where ID=@IsID+4
55 select @addto5=StartDate from #tab_HolidayForUQ where ID=@IsID+5
56 update [dbo].[HolidayForUQ] set AddTo1=@addto1,AddTo2=@addto2,AddTo3=@addto3,AddTo4=@addto4,AddTo5=@addto5 where StartDate=@starttime
57 end else
58 begin
59 --如果当前日期是节假日或者周日,就查询临时表根据大于当前日期添加
60 select top 1 @No1=ID from #tab_HolidayForUQ where StartDate>@starttime order by StartDate asc
61 select @addto1=StartDate from #tab_HolidayForUQ where ID=@No1
62 select @addto2=StartDate from #tab_HolidayForUQ where ID=@No1+1
63 select @addto3=StartDate from #tab_HolidayForUQ where ID=@No1+2
64 select @addto4=StartDate from #tab_HolidayForUQ where ID=@No1+3
65 select @addto5=StartDate from #tab_HolidayForUQ where ID=@No1+4
66 update [dbo].[HolidayForUQ] set AddTo1=@addto1,AddTo2=@addto2,AddTo3=@addto3,AddTo4=@addto4,AddTo5=@addto5 where StartDate=@starttime
67 end
68
69 ---------------------------------------------------------------------------------
70 --next
71 FETCH NEXT FROM Menu
72 INTO @StartDate
73 END
74 CLOSE Menu
75 DEALLOCATE Menu
76 END TRY
77 --捕捉异常
78 BEGIN CATCH
79 SELECT
80 ERROR_NUMBER() as ErrorNumber,
81 ERROR_MESSAGE() as ErrorMessage
82 END CATCH;

SQL实现一年中每个日期剔除节假日和星期天之后的五个日期是多少的更多相关文章

  1. sql存储过程中,如何根据指定日期、月数、天数推算预产日期

    我这边有一个业务,根据某个指定日期,推算某个患者的预产日期 原理:比如孕产的预产日期的算法(预产日期 = 末次月经日期+ 10月+8天) 那么我们怎么通过存储过程来实现呢? 首先分析条件 需要一个指定 ...

  2. SimpleDateFormat 取当前周的周一和周日的日期,当前月第一个和最后一天的日期

    /** * 类说明 :以及获取当前周的周一和周日的日期,当前月第一个和最后一天的日期 * 日期格式化:格式参数  G 年代标志符  y 年 M 月 d 日    h 时 在上午或下午 (1~12)  ...

  3. easyui datebox定位到某一个日期, easyui datebox直接定位到具体的日期, easyui datebox MoveTo方法使用

    easyui datebox定位到某一个日期, easyui datebox直接定位到具体的日期, easyui datebox MoveTo方法使用 >>>>>> ...

  4. C#中用DateTime的ParseExact方法解析日期时间(excel中使用系统默认的日期格式)

    最近做的项目中服务器是英文的系统,系统需要通过excel的单元格导入日期,excel中的日期格式是系统默认的日期格式,如下图所示 以上日期格式,会跟着操作系统设置的日期格式相同例如我的中文系统的日期格 ...

  5. java 根据系统日期获取前一天、后一天时间(根据初始日期推算出期望(向前/向后)日期)

      1.情景展示  java 根据系统当前日期获取前一天日期.后一天日期,或者根据初始日期推算出期望(向前/向后)日期. 2.解决方案 导包 import java.text.ParseExcepti ...

  6. mysql的五种日期和时间类型【转载】

    [mysql的五种日期和时间类型] mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期 ...

  7. jquery判断日期是不是为空,是否大于前面的日期

    jquery判断日期是否为空,是否大于前面的日期,代码如下:方法一function onemonthtypeChange(){var startDate = $("#startDate&qu ...

  8. sql如何通过当前日期获取上周,上上周,上上上周的起始日期(周一_周七)

    当前时间周的起始日期(以周一为例)select DATEADD(week,DATEDIFF(week,0,getdate()),0)上周起始:select dateadd(week,-1,DATEAD ...

  9. SQl Server 函数篇 数学函数,字符串函数,转换函数,时间日期函数

    数据库中的函数和c#中的函数很相似 按顺序来, 这里价格特别的 print  可以再消息栏里打印东西 数学函数 ceiling()  取上限   不在乎小数点后面有多大,直接忽略 floor()   ...

随机推荐

  1. Vue.js开发环境配置与项目创建

    一.需要安装和配置 Node.js 与 npm 二.Vue.js的安装或cdn引用: ·cdn引用(不适合项目开发): <script src="https://cdn.jsdeliv ...

  2. Spring源码-IOC部分-容器初始化过程【2】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  3. Linux性能优化实战(一)

    一.优化方向 1,性能指标 从应用负载的视角出发,考虑"吞吐"和"延时" 从系统资源的视角出发,考虑资源使用率.饱和度等 2,性能优化步骤 选择指标评估应用程序 ...

  4. Python标准库:datetime 时间和日期模块 —— 时间的获取和操作详解

    datetime 时间和日期模块 datetime 模块提供了以简单和复杂的方式操作日期和时间的类.虽然支持日期和时间算法,但实现的重点是有效的成员提取以进行输出格式化和操作.该模块还支持可感知时区的 ...

  5. PHP扩展开发编译环境的搭建

    PHP允许使用扩展的方式,直接使用C语言开发PHP的功能,由于编译的问题,很多底层和框架的基础工作如果用PHP必然会带来额外的开销,降低系统的吞吐量,必然yaf就是这样的思路,把框架封装在扩展里,让系 ...

  6. Jmeter平均响应时间和TPS的计算方法

    转自:https://www.cnblogs.com/xianlai-huang/p/7795215.html Jmeter的Throughput和平均RT的计算 1.TPS:每秒处理的事务数,jme ...

  7. python——虚拟环境管理大合集

    个人常用:pipenv 安装 pip3 install pipenv 创建虚拟环境 # 默认安装在~/.local/virtualenv下 mkdir project cd project pipen ...

  8. 7、前端--jQuery简介、基本选择器、基本筛选器、属性选择器、表单选择器、筛选器方法、节点操作、绑定事件

    jQuery简介 宗旨:Write less, do more. 内部封装了js代码 是编程更加简单并且兼容所有的主流浏览器 版本:1.x 2.x 3.x # 可以使用3.x最新版 是第三方的类库:使 ...

  9. 5道面试题,拿捏String底层原理!

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. String字符串是我们日常工作中常用的一个类,在面试中也是高频考点,这里Hydra精心总结了一波常见但也有点烧脑的String面试题,一共5道 ...

  10. 如何使用IDEA工具右边栏的Database模块

    理解Spring Boot自动配置数据源相关代码进行测试时总是无法链接数据库,但是其他方式链接又是没有问题.不知道哪里出现问题了,后来搜资料无意中看到idea提供了Database模块可以测试,就是用 ...