set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

go

-- 日期检测函数,返回相关节假日

-- 0 非假日

-- 农历相关假日

-- 1 春节(正月初一 至 正月初七)

-- 2 端午节(五月五日)

-- 4 中秋节(八月十五)

--阳历相关节日

-- 8 元旦(1月1日)

-- 16 清明节(4月5日/闰年 4月6日)

-- 32 劳动节(5月1日)

-- 64 国庆节(10月1日)

--128 周末

ALTER  FUNCTION   [dbo].[fnCheckDate](@solarDay DATETIME)

RETURNS   bigint   AS

BEGIN

DECLARE   @solData   int

DECLARE   @offset   int

DECLARE   @iLunar   int

DECLARE   @i   INT

DECLARE   @j   INT

DECLARE   @yDays   int

DECLARE   @mDays   int

DECLARE   @mLeap   int

DECLARE   @mLeapNum   int

DECLARE   @bLeap   smallint

DECLARE   @temp   int

DECLARE   @YEAR   INT

DECLARE   @MONTH   INT

DECLARE   @DAY   INT

DECLARE   @OUTPUTDATE   varchar(100)

DECLARE   @OUTPUTDATA   Bigint   --返回数值

SET @OUTPUTDATA = 0   --初始化为非假日

--保证传进来的日期是不带时间

SET   @solarDay= convert(datetime,@solarDay,23)

SET   @offset=CAST(@solarDay-'1900-01-30' AS INT)

print @solarDay

print @offset

return 0

--确定农历年开始

SET   @i=1900

WHILE   @i<2050   AND   @offset>0

BEGIN

SET   @yDays=348

SET   @mLeapNum=0

SELECT   @iLunar=dataInt   FROM   SolarData   WHERE   yearId=@i

--传回农历年的总天数

SET   @j=32768

WHILE   @j>8

BEGIN

IF @iLunar & @j   >0

SET @yDays=@yDays+1

SET @j=@j/2

END

--传回农历年闰哪个月   1-12   ,   没闰传回   0

SET   @mLeap   = @iLunar & 15

--传回农历年闰月的天数   ,加在年的总天数上

IF   @mLeap > 0

BEGIN

IF   @iLunar & 65536 > 0

SET   @mLeapNum=30

ELSE

SET   @mLeapNum=29

SET   @yDays=@yDays+@mLeapNum

END

SET   @offset=@offset-@yDays

SET   @i=@i+1

END

IF   @offset <=0

BEGIN

SET   @offset=@offset+@yDays

SET   @i=@i-1

END

--确定农历年结束

SET   @YEAR=@i

--确定农历月开始

SET   @i = 1

SELECT   @iLunar=dataInt   FROM   SolarData   WHERE   yearId=@YEAR

--判断那个月是润月

SET   @mLeap   =   @iLunar   &   15

SET   @bLeap   =   0

WHILE   @i    0

BEGIN

--判断润月

SET   @mDays=0

IF   (@mLeap   >   0   AND   @i   =   (@mLeap+1)   AND   @bLeap=0)

BEGIN--是润月

SET   @i=@i-1

SET   @bLeap=1

--传回农历年闰月的天数

IF   @iLunar   &   65536   >   0

SET   @mDays   =   30

ELSE

SET   @mDays   =   29

END

ELSE

--不是润月

BEGIN

SET   @j=1

SET   @temp   =   65536

WHILE   @j<=@i

BEGIN

SET   @temp=@temp/2

SET   @j=@j+1

END

IF   @iLunar & @temp   >   0

SET @mDays = 30

ELSE

SET   @mDays   =   29

END

--解除闰月

IF   @bLeap=1   AND   @i=   (@mLeap+1)

SET   @bLeap=0

SET   @offset=@offset-@mDays

SET   @i=@i+1

END

IF   @offset   <=   0

BEGIN

SET   @offset=@offset+@mDays

SET   @i=@i-1

END

--确定农历月结束

SET   @MONTH=@i

--确定农历日结束

SET   @DAY=@offset

IF   @bLeap=1

SET   @OUTPUTDATE=(CAST(@YEAR   AS   VARCHAR(4))+'-润'+CAST(@MONTH   AS   VARCHAR(2))+'-'+CAST(@DAY   AS   VARCHAR(2)))

ELSE

SET   @OUTPUTDATE=(CAST(@YEAR   AS   VARCHAR(4))+CAST(@MONTH   AS   VARCHAR(2))+'-'+CAST(@DAY   AS   VARCHAR(2)))

DECLARE @tempStart NVARCHAR(20)

DECLARE @tempEnd   NVARCHAR(20)

IF charindex('-润',@OUTPUTDATE) =0  -- 农历假期判断

Begin

-- 春节判断

DECLARE @preYear int

SET @preYear= YEAR(@solarDay)-1

IF(@preYear%4=0 AND (@preYear%100<>0 or (@preYear%100=0 and @preYear%400=0)) )

set @tempStart= Cast(@preYear AS VARCHAR(4)) +'12'+'29'

Else

set @tempStart= Cast(@preYear AS VARCHAR(4)) +'12'+'30'

set @tempEnd =Cast(YEAR(@solarDay) AS VARCHAR(4)) +'01'+'06'

IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) >= @tempStart AND Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) <= @tempEnd)

SET @OUTPUTDATA =@OUTPUTDATA | 1

--端午节判断

set @tempStart= Cast(@preYear AS VARCHAR(4)) +'05'+'05'

IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) = Convert(datetime,@tempStart))

SET @OUTPUTDATA =@OUTPUTDATA | 2

--中秋节

set @tempStart= Cast(@preYear AS VARCHAR(4)) +'08'+'15'

IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) = Convert(datetime,@tempStart))

SET @OUTPUTDATA =@OUTPUTDATA | 4

End

-- 阳历假期判断

--元旦

DECLARE @CurrentYear int

SET @CurrentYear = YEAR(@solarDay)

set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'01'+'01'

IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))

SET @OUTPUTDATA =@OUTPUTDATA | 8

--清明节

IF(@CurrentYear%4=0 AND (@CurrentYear%100<>0 or (@CurrentYear%100=0 and @CurrentYear%400=0)))

set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'04'+'04'

ELSE

set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'04'+'05'

IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))

SET @OUTPUTDATA =@OUTPUTDATA | 16

--五一

set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'05'+'01'

IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))

SET @OUTPUTDATA =@OUTPUTDATA | 32

--十一

set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'10'+'01'

set @tempEnd =Cast(@CurrentYear AS VARCHAR(4)) +'10'+'03'

IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) >= @tempStart AND Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) <= @tempEnd)

SET @OUTPUTDATA =@OUTPUTDATA | 64

-- 周末判断

IF((DATEPART(Weekday,@solarDay)+@@DATEFIRST-1)%7 =0 OR (DATEPART(Weekday,@solarDay)+@@DATEFIRST-1)%7 =6)

SET @OUTPUTDATA =@OUTPUTDATA | 128

RETURN   @OUTPUTDATA

END

mysql 节假日判断_sql 节假日判断(春节、中秋、国庆、周末等)相关推荐

  1. python语言判断中国节假日(pip install chinesecalendar)

    判断某年某月某一天是不是工作日/节假日. 支持 2004年 至 2022年,包括 2020年 的春节延长. 一.安装 pip install chinesecalendar #默认安装是最新版版的1. ...

  2. 最简单判断工作日/节假日API

    由于开发的系统需要根据工作日和节假日来进行逻辑判断,所以这里研究了下方案: 1. 自己维护一份日历表,把每天的日期类型标注清楚 之前的一家公司就是这样解决的,需要每年去手动更新.如果公司规模比较大,对 ...

  3. html判断是否节假日,C# 判断是否是节假日

    1.引用Newtonsoft.Json.dll 2.用API /// /// 判断是不是节假日,节假日返回true /// /// 日期格式:yyyyMMdd /// public static bo ...

  4. python 中节假日(工作日)判断

    python 中节假日(工作日)判断 安装包 pip install chinesecalendar 对以下日期进行节假日以及周末判断 2021-04-03 周六 清明节 2020-04-10 周六 ...

  5. MySQL 高级 - 存储过程 - 语法 - if判断 || 传递参数 (IN - 输入 OUT-输出)

    MySQL 高级 - 存储过程 - 语法 - if判断 传递参数

  6. MYSQL ifnull 函数 、if判断 、case when、 locate函数

    1.MYSQL  ifnull 函数 .if判断 .case when. locate (1).IFNULL(expr1,expr2) 如果expr1为空(即NULL),返回expr2,如果expr1 ...

  7. mysql 永真_sql注入

    Sql注入 Sql注入成因: 1)转义字符处理不当(如',--,/**/,会截断原有的语句,执行新语句): 2)类型处理不当(如接受的是整型的参数,并没有校验也可以接受字符型数据) 3)查询语句的组装 ...

  8. java 时间判断大小_java判断时间大小

    //构造日期格式yyyy-MM-NN SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date d ...

  9. python怎么判断中文_python 判断是否为中文

    python在执行代码过程是不知道这个字符是什么意思的.是否是中文,而是把所有代码翻译成二进制也就是000111这种形式,机器可以看懂的语言. 也就是在计算机中所有的字符都是有数字来表示的.汉字也是有 ...

最新文章

  1. Java 二分法查找
  2. C++中的日期和时间
  3. 神策数据助力海通证券,精耕 4 大场景,全面强化数字化运营
  4. Task 1 天池赛 - 二手车交易价格预测
  5. bytes转16进制整数 python_Python 十进制转二进制、八进制、十六进制
  6. 布局 —— 左侧固定,右侧自适应
  7. epoll和poll的C++11多线程练习
  8. Java在WEB项目中获取文件路径
  9. php 什么是 cookie? 会话 cookie 与持久性 cookie 之间 有何区别?
  10. python数据处理源代码_python数据分析与应用源数据和代码
  11. 培训机构刷题小程序设计与制作
  12. PLC 数据内存读写 调试软件工具
  13. mysql查询前100个_mysql查询前100条数据
  14. FPGA零基础学习:数字电路中的组合逻辑
  15. (二十三)Animator 实例 —— 开场动画
  16. 自媒体怎么赚钱?新手小白日入600+
  17. CSAPP_Chapter1
  18. 音乐播放器(vip在线听下载等等)~~正常运行
  19. 大球吃小球html5,怎么用html5制作简单的大球吃小球的游戏
  20. Como fazer uma要求GET de uma API REST em Java e转换器JSON em um objeto

热门文章

  1. JAVA教程--书的
  2. STM32基于HAL工程硬件I2C读写AT24C02/04/08数据
  3. QT 黑色风格+白色风格+淡蓝色风格样式表。
  4. (一)传说中“哈佛最受欢迎的课程”
  5. spring boot oauth2 facebook
  6. 10部关于数学的顶级纪录片
  7. 202305读书笔记|《因思念而沉着》——任何赞美都是身外之物唯自由可随身携带
  8. 《自控力》读后感——意志力与认识自己
  9. 迷你世界迷你编程 v1.0
  10. 基于安卓的健康体检预约系统APP