代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
MSSQL
】
sql 节假日判断(春节、中秋、国庆、周末等)
作者:
汶纡
/ 发布于
2017/11/13
/
1222
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 < 13 AND @offset > 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
试试其它关键字
同语言下
.
SQL查询 多列合并成一行用逗号隔开
.
查看存储过程修改时间,最近执行时间
.
设置手动批量删除数据库相关进程
.
获取某个表中特定字段的所有字符串形式
.
SQL 如何去除重复的字符串
.
怎么去掉一个字段中的重复数据
.
String 去除空格 回车 换行 水平制表符
.
SQL查询和替换含有回车,空格,TAB
.
SQL SERVER 查询每日新增用户数量、次留数量
.
判断两个字符串是否存在相同的内容
可能有用的
.
SQL查询 多列合并成一行用逗号隔开
.
查看存储过程修改时间,最近执行时间
.
设置手动批量删除数据库相关进程
.
获取某个表中特定字段的所有字符串形式
.
SQL 如何去除重复的字符串
.
怎么去掉一个字段中的重复数据
.
String 去除空格 回车 换行 水平制表符
.
SQL查询和替换含有回车,空格,TAB
.
SQL SERVER 查询每日新增用户数量、次留数量
.
判断两个字符串是否存在相同的内容
汶纡
贡献的其它代码
(
55
)
.
手机类型判断
.
sql 节假日判断(春节、中秋、国庆、周末等)
.
使用LEFT OUTER JOIN 实现not in 子句
.
获取图片宽度高度、大小尺寸、图片类型、用于布局的im
.
简单的大视频截取播放功能
.
如何通過ID號來刪除DataTable中的行
.
检测远程URL是否存在
.
阻止html页面加载
.
sql生成九九乘法表
.
oracle存储遍历表中数据
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3