[原创]用SQL语言计算两个日期间有多少个工作日

上一篇 / 下一篇  2008-07-03 15:08:11 / 个人分类:其它

/*ITPUB个人空间,i"a+HiA6V7^ d
因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日。ITPUB个人空间}e'L5Sm#@
设定是一个星期有5个工作日,从星期一到星期五
S5UJ$Z(ocb|;DGY0说明:ITPUB个人空间J:oR~v%e2X
  第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天
0Rd`S/K sGZ0  末一个星期的工作日数:DATEPART(dw, @enddt),最多5天
y,vVE4Nz;g&X0计算方法:ITPUB个人空间9}.|e+@!hV0n Q
  如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”ITPUB个人空间 m:^O%{([NZnC
  否则按下面的公式计算ITPUB个人空间O.m1OEI#M(^ `!P
    (两个日期间的总天数 - 第一个星期的天数 - 末一个星期的天数) / 7 * 5
n6Ud:Ho e~ l0  + 第一个星期的工作日数
/FI|2e S1W0  + 末一个星期的工作日数ITPUB个人空间6w3? A*v9x9\6b6[
*/ITPUB个人空间 vt b3Lr X/N2Q

S S|&Ag0DECLARE @begdt DATETIME,  --起始日期
'q#z,y-\1dW`0        @enddt DATETIME,  --结束日期ITPUB个人空间6x5~ N+^*nhs8]"@J/A
        @wkday INTITPUB个人空间8Qx[0g;Na&b/Q,g

Mz8v/JEj5DpI$w0SET @begdt = '2008-7-1'
(^}1}3zs5mdl?0SET @enddt = '2008-7-7'ITPUB个人空间pk B0ibe?V!b6e
SET DATEFIRST 1ITPUB个人空间~K4UW~U7E
SELECT @wkday =ITPUB个人空间 K*a D PRQ2A8Q {*\
       CASE WHEN DATEPART(wk, @enddt-1)-DATEPART(wk,@begdt) = 0 THEN
2P-R6J7}1_ E;f k0                   CASE WHEN DATEPART(dw, @enddt-1) >= 6 THEN 6 - DATEPART(dw, @begdt)ITPUB个人空间 DB H8?1y6Z@
                        ELSE DATEPART(dw, @begdt) - DATEPART(dw, @begdt) END
!Fzy T+O{aqt0            ELSE (DATEDIFF(dd,@begdt,@enddt+1)
"I3a~@A1G%^0                        - (8-DATEPART(dw, @begdt))
9B,N @ NT0                        - DATEPART(dw, @enddt)) / 7 * 5ITPUB个人空间AEY5U$QH
               + CASE WHEN DATEPART(dw, @begdt) < 6 THEN 6 - DATEPART(dw, @begdt)ITPUB个人空间)R0U1M iQ#KL
                      ELSE 0 ENDITPUB个人空间6^4~'Z6N5fC"cx g\
               + CASE WHEN DATEPART(dw, @enddt)>5 THEN 5 ELSE DATEPART(dw, @enddt) END
| \%M+p.?w;fv_$A0       ENDITPUB个人空间'N&u w Cc)}Ao
SELECT CONVERT(CHAR(10), @begdt, 121) + '日到' + CONVERT(CHAR(10), @enddt, 121)ITPUB个人空间 A9L!d4U~?
    + '日之间共有' + CONVERT(VARCHAR(20), @wkday) + '个工作日'
}8SBzL0
"c;L*rK`J SG0

TAG:

碧海鑫波 引用 删除 hawkx   /   2008-09-04 10:46:17
原帖由Jay ai于2008-08-18 15:02:35发表
后面天数直接用星期的差*5就行了呀 不要求天数再算
另外用dw算得时间貌似应该-1才是正确的时间 t


谢谢评论!
直接用星期的差 * 5 是有问题的,因为前后两个日期之间的差不一定是整数个星期。

原来的代码在计算第一个星期的天数那里有错误,我已经改过来了。
引用 删除 Jay ai   /   2008-08-18 15:02:35
case when datepart(ww,@enddt)-datepart(ww,@begdt)=0 then
                          case when datepart(dw,@enddt)-1>=0 then 7-datepart(dw,@begdt)
                          else datepart(dw,@enddt)-datepart(dw,@begdt)+1 end
        else datepart(ww,@enddt)-datepart(ww,@begdt)=1 then (7-datepart(dw,@begdt))+(datepart(dw,@enddt)-1)
        else (7-datepart(dw,@begdt))+(datepart(dw,@enddt)-1)+(datepart(ww,@enddt)-datepart(ww,@begdt))*5 end


后面天数直接用星期的差*5就行了呀 不要求天数再算
另外用dw算得时间貌似应该-1才是正确的时间
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-13  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 2139
  • 日志数: 25
  • 文件数: 1
  • 建立时间: 2008-01-17
  • 更新时间: 2008-09-26

RSS订阅

Open Toolbar