苏飞论坛

标题: 计算任意两个时间之间的星期几的次数(纵向显示) [打印本页]

作者: session    时间: 2013-5-15 11:38
标题: 计算任意两个时间之间的星期几的次数(纵向显示)

  1. if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_weekdaycount]') and xtype in (N'FN', N'IF', N'TF'))
  2. drop function [dbo].[f_weekdaycount]
  3. GO
  4. /*--计算任意两个时间之间的星期几的次数(纵向显示)
  5. 本方法直接判断 @@datefirst 做对应处理
  6. 不受 sp_language 及 set datefirst 的影响  
  7. -
  8. /*--调用示例

  9. select * from f_weekdaycount('2004-8-02','2004-8-8')
  10. --*/
  11. create function f_weekdaycount(
  12. @dt_begin datetime,
  13. @dt_end datetime
  14. )returns table
  15. as
  16. return(
  17. select 项目='跨周数'
  18.   ,值=case when @dt_begin<@dt_end
  19.    then (datediff(day,@dt_begin,@dt_end)+7)/7
  20.    else (datediff(day,@dt_end,@dt_begin)+7)/7 end
  21. union all
  22. select a.a,case b.a
  23.   when -1 then case when a.b between b.b and b.c then 1 else 0 end
  24.   when  0 then case when b.b<=a.b then 1 else 0 end
  25.    +case when b.c>=a.b then 1 else 0 end
  26.   else b.a+case when b.b<=a.b then 1 else 0 end
  27.    +case when b.c>=a.b then 1 else 0 end
  28.   end
  29. from(select a='星期一',b=1
  30.   union all select '星期二',2 union all select '星期三',3
  31.   union all select '星期四',4 union all select '星期五',5
  32.   union all select '星期六',6 union all select '星期日',0
  33. )a,(select a=case when @dt_begin<@dt_end
  34.    then datediff(week,@dt_begin,@dt_end)-1
  35.    else datediff(week,@dt_end,@dt_begin)-1 end
  36.   ,b=case when @dt_begin<@dt_end
  37.    then (@@datefirst+datepart(weekday,@dt_begin)-1)%7
  38.    else (@@datefirst+datepart(weekday,@dt_end)-1)%7 end
  39.   ,c=case when @dt_begin<@dt_end
  40.    then (@@datefirst+datepart(weekday,@dt_end)-1)%7
  41.    else (@@datefirst+datepart(weekday,@dt_begin)-1)%7 end)b
  42. )
  43. go
复制代码





欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4