博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL:创建某一时间段内的周末日期表以及特殊处理日期表
阅读量:7020 次
发布时间:2019-06-28

本文共 3132 字,大约阅读时间需要 10 分钟。

   近期有个功能需要判断某个给定日内(如 2012-01-06到2012-07-31)有多少个工作日,其中需要用到一个周末日期表,此表列出给定日期段内的所有属于周末的日期。

于是创建如下: 

DROP 
TABLE #calendar 
CREATE 
TABLE #calendar (calendardate 
DATETIME
DECLARE 
@startdate 
DATETIME
DECLARE 
@enddate 
DATETIME
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 
 
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
')
  
--
日期表内的第一天
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 
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
' 
select 
@x 
= EOMProcessdate 
from dbo.Corporate_Calendar 
    
where 
convert(
varchar(
10),date,
112
=
convert(
varchar(
10),
@date,
112)
If 
@type
=
'
EOW
' 
select 
@x 
= EOWProcessdate 
from dbo.Corporate_Calendar 
    
where 
convert(
varchar(
10),date,
112
=
convert(
varchar(
10),
@date,
112)
If 
@type
=
'
Special
' 
select 
@x 
= SpecialProcessdate 
from dbo.Corporate_Calendar 
    
where 
convert(
varchar(
10),date,
112
=
convert(
varchar(
10),
@date,
112)
return 
@x
end
go

使用方法

--
select dbo.udf_isProcessDate(getdate(),'WorkDay')

 

 

转载地址:http://drsxl.baihongyu.com/

你可能感兴趣的文章
VisualStudio快捷键
查看>>
编写Chrome扩展程序
查看>>
RabbitMQ学习笔记4-使用fanout交换器
查看>>
一些组织和个人网站
查看>>
iOS开发小技巧 -- tableView-section圆角边框解决方案
查看>>
微服务Spring Cloud与Kubernetes比较
查看>>
MyBatis 源码分析——介绍
查看>>
关于iTerm2中颜色配置及快捷键使用技巧(亲测)
查看>>
tomcat启动报错 java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
查看>>
二叉树应用进阶之折纸(二叉树的右根左遍历)
查看>>
PSPP:顶替SPSS常用功能的优秀软件, Linux 下的经济学用软件
查看>>
逍遥安卓-完整命令行
查看>>
使用canvas制作的移动端color picker
查看>>
C#实现XML与DataTable互转
查看>>
运维相关开源项目
查看>>
Redis(二)-- 发布订阅、事务、安全、持久化
查看>>
[ffmpeg 扩展第三方库编译系列] frei0r mingw32 下编译问题
查看>>
Lua MD5加密字符串
查看>>
清浮动的几种方式
查看>>
我的开放代码
查看>>