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() ...
随机推荐
- CKKS Part5: CKKS的重缩放
本文翻译于 CKKS EXPLAINED, PART 5: RESCALING,主要介绍CKKS方案中最重要的技术- rescaling,重缩放技术 介绍 在CKKS的前一篇文章 CKKS Part4 ...
- 解决 413 Request Entity Too Large
修改配置文件 vim /etc/nginx/sites-available/default,增加 client_max_body_size 1000m;//最大上传大小 proxy_connect_ ...
- 入门 - 复习Kubernetes核心概念 (八)
本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...
- React凤凰项目规范
技术资源 基础语法 ES6 TS 框架 React Redux React-redux React-Router UmiJS Dva 组件库 AntDesign AntV 构建编译 Webpack b ...
- EasyExcel小试牛刀
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/12029411.html 某种偶然的机会遇到了这个插件, 听说很牛X, 我之前也不知道, 不过还 ...
- 推荐一款仿iPhone桌面的代码. ___王朋.
Demo:https://files.cnblogs.com/files/sixindev/LxGridView-master.zip 这是作者原来的效果图,很多东西还需要慢慢学习.作者用的很多类,根 ...
- Hibernate与JDBC事务整合
一般大家都会使用Spring声明型事务 transactionAttributes 为 PROPAGATION_REQUIRED Hibernate 使用 HibernateTransactionMa ...
- Docker镜像实战(ssh、systemctl、nginx、tomcat、mysql)
Docker镜像实战 1.构建ssh镜像 2.构建systemctl 镜像 3.构建nginx镜像 4.构建tomcat镜像 5.构建mysql镜像 1.构建ssh镜像: 创建镜像目录 mkdir / ...
- Solution Set -「ARC 107」
「ARC 107A」Simple Math Link. 答案为: \[\frac{a(a+1)\cdot b(b+1)\cdot c(c+1)}{8} \] 「ARC 107B」Quadrup ...
- [LeetCode]3.无重复字符的最长子串(Java)
原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...