SQL实现一年中每个日期剔除节假日和星期天之后的五个日期是多少
最近公司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实现一年中每个日期剔除节假日和星期天之后的五个日期是多少的更多相关文章
- sql存储过程中,如何根据指定日期、月数、天数推算预产日期
我这边有一个业务,根据某个指定日期,推算某个患者的预产日期 原理:比如孕产的预产日期的算法(预产日期 = 末次月经日期+ 10月+8天) 那么我们怎么通过存储过程来实现呢? 首先分析条件 需要一个指定 ...
- SimpleDateFormat 取当前周的周一和周日的日期,当前月第一个和最后一天的日期
/** * 类说明 :以及获取当前周的周一和周日的日期,当前月第一个和最后一天的日期 * 日期格式化:格式参数 G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) ...
- easyui datebox定位到某一个日期, easyui datebox直接定位到具体的日期, easyui datebox MoveTo方法使用
easyui datebox定位到某一个日期, easyui datebox直接定位到具体的日期, easyui datebox MoveTo方法使用 >>>>>> ...
- C#中用DateTime的ParseExact方法解析日期时间(excel中使用系统默认的日期格式)
最近做的项目中服务器是英文的系统,系统需要通过excel的单元格导入日期,excel中的日期格式是系统默认的日期格式,如下图所示 以上日期格式,会跟着操作系统设置的日期格式相同例如我的中文系统的日期格 ...
- java 根据系统日期获取前一天、后一天时间(根据初始日期推算出期望(向前/向后)日期)
1.情景展示 java 根据系统当前日期获取前一天日期.后一天日期,或者根据初始日期推算出期望(向前/向后)日期. 2.解决方案 导包 import java.text.ParseExcepti ...
- mysql的五种日期和时间类型【转载】
[mysql的五种日期和时间类型] mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期 ...
- jquery判断日期是不是为空,是否大于前面的日期
jquery判断日期是否为空,是否大于前面的日期,代码如下:方法一function onemonthtypeChange(){var startDate = $("#startDate&qu ...
- sql如何通过当前日期获取上周,上上周,上上上周的起始日期(周一_周七)
当前时间周的起始日期(以周一为例)select DATEADD(week,DATEDIFF(week,0,getdate()),0)上周起始:select dateadd(week,-1,DATEAD ...
- SQl Server 函数篇 数学函数,字符串函数,转换函数,时间日期函数
数据库中的函数和c#中的函数很相似 按顺序来, 这里价格特别的 print 可以再消息栏里打印东西 数学函数 ceiling() 取上限 不在乎小数点后面有多大,直接忽略 floor() ...
随机推荐
- Javascript之递归求裴波那契数
一.遍历的方式性能更加,递归的方式代码利于阅读.简短,性能略差 二.裴波那契数定义: · 位置0的裴波那契数为0 · 1和2的裴波那契数为1 · n(n > 2)裴波那契数为 (n-1)的裴波那 ...
- springboot 添加mybatisjar包发生的异常问题?
一.pro.xml文件中,添加mybatisjar包 <?xml version="1.0" encoding="UTF-8"?> <proj ...
- ApacheCN 网络安全译文集 20211025 更新
Android 渗透测试学习手册 中文版 第一章 Android 安全入门 第二章 准备实验环境 第三章 Android 应用的逆向和审计 第四章 对 Android 设备进行流量分析 第五章 And ...
- 一步一步搭建基于ffmpeg和sdl2的流媒体播放器
一. 背景: 一步一步从资料收集.技术选型.代码编写.性能优化,动手搭建一款支持rtsp.rtmp等常用流媒体格式的视频播放器,ffmpeg用于流媒体解码,sdl2用于视频画面渲染和声音播放. 二. ...
- 2020-11-21 f
题意:给定一个长度为 \(n\) 的序列 \(A\),\(A_i \in [0, 2 ^ k)\).定义 \(f(x)\) 为 \(A_1\) ^ \(x\),\(A_2\) ^ \(x \cdots ...
- listview界面显示
1.布局写listview 2.找到listview 3.封装新闻数据到list集合中 ,目的是为adapter提供数据展示. 4.封装一个Adapter类继承B ...
- linux中vim编辑器三种模式及常用命令的使用
Linux命令经常使用才会烂熟于心 命令行模式: 移动光标: 向下左右箭头可以移动光标: 将光标移动到行尾:$; 将光标移动到行头:^: 将光标移动到页尾:shift+g; 将光标移动到页头:1+sh ...
- 总结haproxy各调度算法的实现方式及其应用场景
一.静态算法 1.1 static-rr 基于权重的轮询调度,不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 w ...
- linux c 线程相关函数
线程相关函数(1)-pthread_create(), pthread_join(), pthread_exit(), pthread_cancel() 创建取消线程 一. pthread_creat ...
- MySQL5.7修改登录密码的几种方式
1.更新mysql.user表 use mysql UPDATE user SET authentication_string = password('新密码') where user = 'root ...