DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: canfee
今日帖子: 11
在线用户: 18
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 dcopyboy (dcopyboy) ★☆☆☆☆ -
普通会员
2017/4/29 22:16:01
标题:
SQL 中关于工作日的计算 浏览:1620
加入我的收藏
楼主:     近日在一小项目中遇到需要计算今天之前(之后)若干工作日的问题,花数小时百度,均未搜到到满意答案,逐自行写了一个,颇感满意:
 CREATE TABLE [dbo]. [T_SYS_Holiday](
[id] [int] IDENTITY(1, 1) NOT NULL,
[name] [varchar](100) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Hdate] [datetime] NOT NULL,
[isholiday] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
CONSTRAINT [PK_T_SYS_Holiday] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
)ON [PRIMARY]
GO

--2017年节假日数据
INSERT INTO T_SYS_Holiday
          (name,Hdate,isholiday)
 select '元旦补休','2017-01-02','节假日'
UNION select '春节补班','2017-01-22','非节假日'
UNION  select '春节休息','2017-01-27','节假日'
UNION select '春节休息','2017-01-30','节假日'
UNION select '春节休息','2017-01-31','节假日'
UNION select '春节休息','2017-02-01','节假日'
UNION select '春节休息','2017-02-02','节假日'
UNION select '春节补班','2017-02-04','非节假日'
UNION select '清明补班','2017-04-01','非节假日'
UNION select '清明','2017-04-03','节假日'
UNION select '清明','2017-04-04','节假日'
UNION select '五一','2017-05-01','节假日'
UNION select '端午补班','2017-05-27','非节假日'
UNION select '端午','2017-05-29','节假日'
UNION select '端午','2017-05-30','节假日'
UNION select '国庆补班','2017-09-30','非节假日'
UNION select '国庆','2017-10-02','节假日'
UNION select '国庆','2017-10-03','节假日'
UNION select '国庆','2017-10-04','节假日'
UNION select '国庆','2017-10-05','节假日'
UNION select '国庆','2017-10-06','节假日'

---计算几天前的工作日
create function dbo.GetPreWorkDay
(@date0 datetime,
 @x int)
returns datetime
as
begin
 declare @i int,@date1 datetime
 select @i=1,@date1=@date0
 while(@i<=@x)
 begin
  select @date1=dateadd(d,-1,@date1)
  if datepart(dw,@date1) not in(1,7)
  begin
    select @i=@i+1
  end
   if exists (select HDate from t_sys_holiday where isholiday='节假日' and @date1>= HDate and @date1<HDate +1)
  begin
    select @i=@i-1
  end
  if exists (select HDate from t_sys_holiday where isholiday='非节假日' and @date1>= HDate and @date1<HDate +1)
  begin
    select @i=@i+1
  end
 end
 return @date1
end
Go
---计算几天后的工作日
create function dbo.GetNextWorkDay
(@date0 datetime,
 @x int)
returns datetime
as
begin
 declare @i int,@date1 datetime
 select @i=1,@date1=@date0
 while(@i<=@x)
 begin
  select @date1=dateadd(d,1,@date1)
  if datepart(dw,@date1) not in(1,7)
  begin
    select @i=@i+1
  end
  if exists (select HDate from t_sys_holiday where isholiday='节假日' and @date1>= HDate and @date1<HDate +1)
  begin
    select @i=@i-1
  end
  if exists (select HDate from t_sys_holiday where isholiday='非节假日' and @date1>= HDate and @date1<HDate +1)
  begin
    select @i=@i+1
  end
 end
 return @date1
end

Go

--select dbo.GetNextWorkDay('2017-01-20',7)
--select dbo.GetPreWorkDay('2017-02-4',7)

--select dbo.GetNextWorkDay('2017-04-20',7)
--select dbo.GetPreWorkDay('2017-05-2',7)

若有不当之处,望大伙指正。
----------------------------------------------
-
作者:
男 beibeili (beibeili) ★☆☆☆☆ -
普通会员
2017/5/2 8:33:36
1楼: 建议不要这样硬编码!
你的代码2017年是有效的,那么2018年呢?难道再改一次代码?
建议创建一个字典表用来记录每年的节假日信息,这样不但好维护,而且不必使用那一堆Union,效率会高很多的
----------------------------------------------
-
作者:
男 beibeili (beibeili) ★☆☆☆☆ -
普通会员
2017/5/2 11:52:58
2楼: 不好意思,没有看清楚,您是创建了字典表!
:(
----------------------------------------------
-
作者:
男 star5 (星五) ★☆☆☆☆ -
盒子活跃会员
2017/5/2 13:06:51
3楼: 感谢楼主分享!
----------------------------------------------
博客 - http://offeu.com
脚本模型 - http://webpascal.com
需要短信接口的请联系我,可发行业与营销内容。
作者:
男 luwakin (luwakin) ★☆☆☆☆ -
普通会员
2017/5/2 21:15:14
4楼: 每年的节假日又不一定,只能硬编码吧。
但是可以写个小程序直接去日历网站抓数据,反正也就一年抓一次就可以了
直接抓一年每一天的数据
----------------------------------------------
-
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2017/5/2 22:20:05
5楼: 前几天看到有个兄弟写了个阳历和农历转换的工具。这样是不是就能算出春节,端午,清明这些日期了?
----------------------------------------------
-
作者:
男 lsh341999 (虫子) ★☆☆☆☆ -
普通会员
2017/5/3 13:42:57
6楼: 要灵活的才行
----------------------------------------------
就怕想不到,没有做不到的
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行97.65625毫秒 RSS