SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解
| 月内日索引(从1开始计数) | int位索引(从0开始计数) |
|
1
|
0
|
|
2
|
1
|
|
3
|
2
|
| …… |
……
|
|
28
|
28
|
|
29
|
28 |
|
30
|
29
|
| 31 |
30
|
月内日索引和int索引相差1,这个很容易发现的。
IF OBJECT_ID(N'dbo.usp_Calendar_WorkDaySet', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo.usp_Calendar_WorkDaySet;
END
GO --==================================
-- 功能: 设置指定月份的工作日标志
-- 说明: 具体实现阐述
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
--================================== CREATE PROCEDURE usp_Calendar_WorkDaySet
(
@intMonths INT, -- 指定的日期月数
@intWorkDayValueSum INT, -- 指定的日期月数的所有工作日标志值之和
@bitIsUseDefault BIT = 0, -- 是否使用默认设置,1:使用默认设置(周一到周五为工作日,周六和周日非工作日),0:基于指定的日期月数的所有工作日标志值之和来设置 -- 方便记录用户操作日志
--@chvnUser NVARCHAR(20), -- 指定的用户
--@intUserID INT, -- 指定的用户ID
--@chvUserIP VARCHAR(40), -- 指定的用户IP
--@chvnUserFrom NVARCHAR(30), -- 指定的用户位置 @chvnErrMsg NVARCHAR(100) OUTPUT -- 错误异常消息字符串
)
--$Encode$--
AS
BEGIN
SET NOCOUNT ON; SET @intMonths = dbo.ufn_GetValidDateNum(@intMonths); IF @intWorkDayValueSum IS NULL OR @intWorkDayValueSum < 0
BEGIN
SET @intWorkDayValueSum = 0;
END SET @chvnErrMsg = N''; DECLARE @tintResultValue AS TINYINT;
SET @tintResultValue = 1; -- 默认存在错误 DECLARE
@dtmNow AS DATETIME,
@intDays AS INT;
SELECT
@dtmNow = GETDATE(),
@intDays = dbo.ufn_Days(@dtmNow); IF @intMonths < dbo.ufn_Months(@dtmNow)
BEGIN
SET @chvnErrMsg = N'不能设置小于当前月份的工作日标志。'; RETURN @tintResultValue;
END DECLARE
@WorkDayValueSum AS INT,
@DayCount AS INT;
SELECT
@WorkDayValueSum = 0,
@DayCount = 0; SELECT
@WorkDayValueSum = SUM(POWER(2, [DayOfMonth] - 1))
,@DayCount = COUNT(1)
FROM dbo.Calendar
WHERE Months = @intMonths
AND [Days] >= @intDays + 1; IF @DayCount = 0 OR @WorkDayValueSum = 0
BEGIN
SET @chvnErrMsg = N'日历数据表不存在满足条件的数据。'; RETURN @tintResultValue;
END IF @intWorkDayValueSum = @WorkDayValueSum
BEGIN
SET @tintResultValue = 0; RETURN @tintResultValue;
END DECLARE @intRowCount AS INT;
SELECT @intRowCount = 0; BEGIN TRY
IF @bitIsUseDefault = 0
BEGIN
UPDATE Calendar
SET WorkdayFlag = POWER(2, [DayOfMonth] - 1) & @intWorkDayValueSum
WHERE Months = @intMonths
AND [Days] >= @intDays + 1;
END
ELSE
BEGIN
UPDATE Calendar
SET WorkdayFlag = CASE WHEN dbo.ufn_DayOfWeek(CalendarDate) <= 5 THEN 1 ELSE 0 END
WHERE Months = @intMonths
AND [Days] >= @intDays + 1;
END SET @intRowCount = @@ROWCOUNT; SET @tintResultValue = 0;
END TRY
BEGIN CATCH
SET @chvnErrMsg = N'设置指定月的工作日标志发生错误。'; RETURN @tintResultValue;
END CATCH RETURN @tintResultValue;
END
GO -- Test Code
DECLARE
@intMonths AS INT,
@intWorkDayValueSum AS INT,
@bitIsUseDefault AS BIT,
@chvnErrMsg AS NVARCHAR(100),
@tintResultVaule AS TINYINT;
SELECT
@intMonths = 0, -- int
@intWorkDayValueSum = 0, -- int
@bitIsUseDefault = NULL, -- bit
@chvnErrMsg = N'', -- nvarchar(100)
@tintResultVaule = 1; -- tinyint EXEC @tintResultVaule = dbo.usp_Calendar_WorkDaySet
@intMonths = @intMonths, -- int
@intWorkDayValueSum = @intWorkDayValueSum, -- int
@bitIsUseDefault = @bitIsUseDefault, -- bit
@chvnErrMsg = @chvnErrMsg OUTPUT -- nvarchar(100) SELECT @chvnErrMsg AS 'Error Message'
,@tintResultVaule AS 'Return Value';
GO -- Test Code
-- 2016-02月份
-- 根据国家节假日获取的工作日标志值和以及工作日总数
SELECT
WorkDayValueSum = SUM(T.WorkDayFlag2 * POWER(2, T.[DayOfMonth] - 1))
,WorkDayCount = SUM(T.WorkDayFlag2 * 1)
FROM (
SELECT
Months
,[DayOfMonth]
,WorkDayFlag
,WorkDayFlag2 = CASE
WHEN [DayOfMonth] = 6 THEN 1
WHEN [DayOfMonth] BETWEEN 7 AND 12 THEN 0
WHEN [DayOfMonth] = 14 THEN 1
ELSE WorkDayFlag END
FROM dbo.Calendar
WHERE Months = dbo.ufn_Months('2016-02-01')
) AS T
GO DECLARE
@intMonths AS INT,
@intWorkDayValueSum AS INT,
@bitIsUseDefault AS BIT,
@chvnErrMsg AS NVARCHAR(100),
@tintResultVaule AS TINYINT;
SELECT
@intMonths = dbo.ufn_Months('2016-02-01'), -- int
@intWorkDayValueSum = 333963327, -- int
@bitIsUseDefault = 0, -- bit
@chvnErrMsg = N'', -- nvarchar(100)
@tintResultVaule = 1; -- tinyint EXEC @tintResultVaule = dbo.usp_Calendar_WorkDaySet
@intMonths = @intMonths, -- int
@intWorkDayValueSum = @intWorkDayValueSum, -- int
@bitIsUseDefault = @bitIsUseDefault, -- bit
@chvnErrMsg = @chvnErrMsg OUTPUT -- nvarchar(100) SELECT @chvnErrMsg AS 'Error Message'
,@tintResultVaule AS 'Return Value';
GO






IF OBJECT_ID(N'dbo.usp_Calendar_WeekDayGet', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo.usp_Calendar_WeekDayGet
END
GO --==================================
-- 功能: 获取满足条件的日期月数的工作日值和工作日总数
-- 说明: 具体实现阐述
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
--==================================
CREATE PROCEDURE dbo.usp_Calendar_WeekDayGet
(
@intStartMonths INT, -- 指定的开始日期月数
@intEndMonths INT -- 指定的结束日期月数
)
--$Encode$--
AS
BEGIN
SET NOCOUNT ON; SET @intStartMonths = dbo.ufn_GetValidDateNum(@intStartMonths);
SET @intEndMonths = dbo.ufn_GetValidDateNum(@intEndMonths); IF @intStartMonths > @intEndMonths
BEGIN
DECLARE @intTemp AS INT;
SET @intTemp = @intStartMonths;
SET @intStartMonths = @intEndMonths;
SET @intEndMonths = @intTemp;
END SELECT
Months
,WorkDayValueSum = ISNULL(SUM(WorkDayFlag * POWER(2, [DayOfMonth] - 1)), 0)
,WorkDayCount = ISNULL(SUM(WorkDayFlag * 1), 0)
FROM dbo.Calendar
WHERE Months BETWEEN @intStartMonths AND @intEndMonths
GROUP BY Months;
END
GO -- Test Code
DECLARE
@intStartMonths AS INT,
@intEndMonths AS INT,
@tintResultValue AS TINYINT; SELECT
@intStartMonths = dbo.ufn_Months('2015-06-01'),
@intEndMonths = dbo.ufn_Months('2016-03-02'),
@tintResultValue = 1; -- 默认范围值 EXEC @tintResultValue = dbo.usp_Calendar_WeekDayGet
@intStartMonths = @intStartMonths, -- int
@intEndMonths = @intEndMonths; -- int SELECT @tintResultValue AS 'Return Value (1:Have Error,0:No Error)'
GO


SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解的更多相关文章
- SQL Server时间粒度系列----第4节季、年时间粒度详解
本文目录列表: 1.SQL Server季时间粒度2.SQL Server年时间粒度 3.总结语 4.参考清单列表 SQL Serve季时间粒度 季时间粒度也即是季度时间粒度.一年每3 ...
- SQL Server时间粒度系列----第9节时间粒度示例演示
本文目录列表: 1.准备测试数据 2.向测试数据表添加相关时间粒度字段列 3.基于日月季年统计汇总的演示 4.总结语 5.参考清单列表 准备测试数据 为了提供不同时间粒度示例的演示,就需要测试 ...
- SQL Server时间粒度系列----第1节时间粒度概述
本文目录列表: 1.什么是时间粒度?2.SQL Server提供的时间粒度3.SQL Server时间粒度代码演示 4.SQL Server基准日期 5.总结语6.参考清单列表 什么是时间粒度 ...
- SQL Server时间粒度系列----第3节旬、月时间粒度详解
本文目录列表: 1.SQL Server旬时间粒度2.SQL Server月有关时间粒度 3.SQL Server函数重构 4.总结语 5.参考清单列表 SQL Server旬时间粒度 ...
- SQL Server时间粒度系列----第5节小时、分钟时间粒度详解
本文目录列表: 1.SQL Server小时时间粒度2.SQL Server分钟时间粒度 3.总结语 4.参考清单列表 SQL Server小时时间粒度 这里说的时间粒度是指带有 ...
- SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现
本文目录列表: 1.基于当前日的小时数和分钟数2.mysql unix_timestamp和from_unixtime的mssql实现 3.总结语 4.参考清单列表 基于当前日的小时数和分钟数 ...
- SQL Server时间粒度系列
工作中经常遇到针对业务部门提出不同时间粒度(年.季度.月.周.日等等日期时间粒度,以下简称时间粒度)的数据统计汇总任务,也看到不少博友针对这方便的博文,结合SQL Server的日期时间函数和 ...
- SQL Server时间粒度系列----第7节日历数据表详解
本文目录列表: 1.时间粒度有关描述 2.时间维度有关功能函数3.日历数据表 4.日历数据表数据填充 5.总结语 6.参考清单列表 时间粒度有关描述 将该系列涉及到的时间粒度以及分钟以下的粒度 ...
- SQL Server时间粒度系列----第2节日期、周时间粒度详解
本文目录列表: 1.从MySQL提供的TO_DAYS和FROM_DAYS这对函数说起2.SQL Server日期时间粒度3.SQL Server周有关时间粒度 4.总结语 5.参考清单列表 从My ...
随机推荐
- Js中变量的作用域
一.理解函数作用域需要理解以下几点: 1.函数变量的作用域有全局变量和局部变量两种,全局变量写在函数的最前面,局部变量写在函数体内,局部变量省略了var 也就默认成为了全局变量! 2.函数 ...
- qt5.5 qtcreator中文乱码
MSVC2010默认保存GBK编码.如果不转换成utf-8编码,对GBK编码的文件,中文可以直接用QStringLiteral()宏,如:QMessageBox msgBox;msgBox.setTe ...
- Mpale 在汽车底盘悬架系统公差分析应用
汽车底盘的作用是接受发动机的动力,使车轮转动,并保证汽车按驾驶员的操纵正常行驶.底盘包括传动系统.行驶系统.转向系统和制动系统这四大部分,通常,这四大系统也简称为传动系.行驶系.转向系和制动系.悬架是 ...
- ios培训机构排名
移动互联网的时代,智能手机的作用已经无所不在,APP在人们的生活中也起到了非常重要的作用,iOS开发行业同样受到越来越多人的关注,更多的人选择参加iOS培训机构来加入这个行列,而如何选择一个真正可以学 ...
- 一起来测试天兔Lepus3.8 Beta版本的MSSQL部分
一起来测试天兔Lepus3.8 Beta版本的MSSQL部分 产品介绍:http://www.lepus.cc/下载地址:http://www.lepus.cc/soft/18手册地址:http:// ...
- SQL Server 2012大幅增强T-SQL
SQL Server 2012对T-SQL进行了大幅增强,其中包括支持ANSI FIRST_VALUE和LAST_VALUE函数,支持使用FETCH与OFFSET进行声明式数据分页,以及支持.NET中 ...
- UI控件(UIImageView)
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; image1_ = [UIImage imageNa ...
- iOS开发系列--并行开发其实很容易
--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...
- CSS3 Animation制作飘动的浮云和星星效果
带平行视差效果的星星 先看效果: 如果下方未出现效果也可前往这里查看 http://sandbox.runjs.cn/show/0lz3sl9y 下面我们利用CSS3的animation写出这样的动画 ...
- ASP.NET Web API的Controller是如何被创建的?
Web API调用请求的目标是定义在某个HttpController类型中的某个Action方法,所以消息处理管道最终需要激活目标HttpController对象.调用请求的URI会携带目标HttpC ...