最近公司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. Atcoder ARC-064

    ARC064(2020.7.23) A 直接贪心即可. B 手玩样例可以猜出这样一个结论,如果两端字符相同,如果字符串长度为奇数那么后手赢,否则先手赢,两端字符不同则相反.证明的话先从特殊情况开始入手 ...

  2. JS 选择结构语句与循环结构语句

    笔记整理自:廖雪峰老师的JS教程 选择结构 与Java使用一致. 需要注意的 JavaScript把null.undefined.0.NaN和空字符串''视为false,其他值一概视为true. 循环 ...

  3. Handler消息机制的写法

    使用Handler的步骤:         1.主线程中创建一个Handler         private Handler handler = new Handler(){             ...

  4. 学习JDBC遇到的一些问题

    1. 数据库版本与驱动对应问题 参考官方文档:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html 具体详情还需 ...

  5. LaunchScreen&LaunchImage

    优先级:LaunchScreen > LaunchImage 在xcode配置了,不起作用 1.清空xcode缓存 2.直接删掉程序 重新运行 如果是通过LaunchImage设置启动界面,那么 ...

  6. 我的新书——《PHP程序员面试笔试宝典》

    你好,是我琉忆. 一个文艺的PHP开发工程师. 很荣幸能够在这里带来我的第一本新书--<PHP程序员面试笔试宝典>. 一.创作过程 <PHP程序员面试笔试宝典>是我的第一本书, ...

  7. Solution -「LOCAL」模板

    \(\mathcal{Description}\)   OurOJ.   给定一棵 \(n\) 个结点树,\(1\) 为根,每个 \(u\) 结点有容量 \(k_u\).\(m\) 次操作,每次操作 ...

  8. 如何强制关闭Win10自动更新

    今天我向往常一样打开了电脑,在工作时突然感觉CPU风扇嗡嗡的响电脑开始变得极慢内存也开始上涨,我意识到不妙了,Windows10 又开始在后台给我搞事情了,由于我的电脑安装有开机还原功能,所以每次开机 ...

  9. 用eclipse写jsp报以下错误

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ tag ...

  10. Web应用程序攻击和检查框架w3af

    实验目的 利用w3af爬虫插件探测出目标网站的目录结构. 实验原理 1) W3AF是一个web应用安全的攻击.审计平台,通过增加插件来对功能进行扩展.这是一款用python写的工具,可以查看所有源代码 ...