设为首页 加入收藏

TOP

SQL:创建某一时间段内的周末日期表以及特殊处理日期表(一)
2014-11-24 02:52:25 来源: 作者: 【 】 浏览:3
Tags:SQL: 创建 一时间段 周末 日期 以及 特殊 处理

近期有个功能需要判断某个给定日内(如 2012-01-06到2012-07-31)有多少个工作日,其中需要用到一个周末日期表,此表列出给定日期段内的所有属于周末的日期。
于是创建如下:
DROP TABLE #calendar
CREATE TABLE #calendar (calendardate DATETIME)
DECLARE @startdate DATETIME
DECLARE @enddate DATETIME
www.2cto.com
SET @startdate='2012-01-01'
SET @enddate='2012-07-31'
WHILE @startdate <= @enddate
BEGIN
INSERT INTO #calendar
( calendardate)
SELECT @startdate
SET @startdate = dateadd (DD, 1, @startdate)
END
SELECT * FROM #calendar
SELECT CALENDARDATE,datename(dw,calendardate) AS DAYNAME
,CASE WHEN datename(dw,calendardate)='Saturday' THEN dateadd(mi,390,calendardate)
WHEN datename(dw,calendardate)='Monday' THEN dateadd(ss,23399,calendardate)
ELSE calendardate
END AS DELwithWEEKEND
FROM #calendar www.2cto.com
WHERE datename(dw,calendardate) in ('Saturday','Monday')
ORDER BY CALENDARDATE
还有另一个类似的解决方案,我们创建一个表,此表把给定日期段的每一天都归入某一类(eg:holiday, workday, EOMProcessdate....)如下图:

创建步骤如下:
1、创建一个临时表
create table #Corporate_Calendar (
Dateid int identity(1,1),
Date datetime,
Holiday bit default 0,
Workday bit default 0,
EOMProcessdate bit default 0,
EOWProcessdate bit default 0,
SpecialProcessdate bit default 0,
Datestamp datetime default getdate())
go
2、在此临时表内填充所有日期。
你需要指定开始的日期以后此后跨度的天数,如此例,我们从2012年1月1号开始,往后创建365天,即2012年一年的数据。
declare @n int
declare @maxn int
declare @begindate datetime
set @n =1
set @maxn=365 -- 日期表中需要创建的天数
set @begindate =convert(datetime,'01/01/2012')
--日期表内的第一天 www.2cto.com
set @begindate =@begindate -1
while @n <= @maxn
begin
insert into #Corporate_Calendar(date) select @begindate+@n
set @n=@n+1
end
select * from #Corporate_Calendar
3、把日期表内的周末日期和工作日期分别标识出来
update #Corporate_Calendar
set holiday=1 where datename(dw,date) in ('Saturday','Sunday')
go
update #Corporate_Calendar
set workday=1 where holiday=0
go
4、分别标识出每周最后一天,每月最后一天以及其它特殊处理日标识。如此例,我们标识2012-03-11是某周最后一天。
update #Corporate_Calendar www.2cto.com
set EOWProcessdate =1 where date ='2012-03-11'
5、标识出特殊的节假日,如此处我们标识出圣诞节和复活节
update #Corporate_Calendar
set holiday=1 where date = '12/25/2012' -- Xmas day
go
update #Corporate_Calendar
set holiday=1 where date = '3/25/2012' -- Easter
go
6、如果我们把此临时表创建到 数据库的正常数据表如
内,我们可以通过创建一个Function来使用此表,判断某一天是否在我们需要特殊关照的某类日期内。
create function dbo.udf_isProcessDate (@date datetime, @Type varchar(10))
returns bit
begin
declare @x bit
set @x=NULL
If @type='Holiday'
select @x = holiday from dbo.Corporate_Calendar
where convert(varchar(10),date,112) =convert(varchar(10),@date,112)
If @type='Workday'
select @x = WorkDay from dbo.Corporate_Calendar
where convert(varchar(10),date,112) =convert(varchar(10),@date,112)
If @type='EOM' www.2cto.com
select @x = EOMProcessdate from dbo.Corporate_Calendar
where convert(varchar(10),date,112) =convert(varchar(10),@date,112)
If @type='EOW'
select @x = EO WProcessdate from dbo.Corporate_Calendar
where convert(varchar(10),date,112) =convert(varchar(10),@date,112)
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇sql server时间函数语句 下一篇Sql server中对时间类型的字段转换

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何理解智能指针? (2025-12-24 12:48:26)
·c++是否应避免使用普 (2025-12-24 12:48:23)
·如何通俗易懂学会 C+ (2025-12-24 12:48:21)
·在 C 语言函数中,如 (2025-12-24 12:19:41)
·C盘里面的AppData文 (2025-12-24 12:19:38)