任意两个时间之间的星期几的次数-横

本文介绍了一个SQL函数f_weekdaycount,用于计算两个指定日期间各星期出现的次数。该函数不受语言设置影响,并能准确计算出包括开始和结束日期在内的每一天是星期几。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_weekdaycount]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_weekdaycount]
GO

/*--计算任意两个时间之间的星期几的次数(横向显示)

    本方法直接判断 @@datefirst 做对应处理
    不受 sp_language 及 set datefirst 的影响    

--邹建 2004.08(引用请保留此信息)--
*/

/*--调用示例
   
    select * from f_weekdaycount('2004-9-01','2004-9-02')
--
*/
create function f_weekdaycount(
@dt_begin datetime,
@dt_end datetime
)
returns table
as
return(
   
select 跨周数
        ,周一
=case a
           
when -1 then case when 1 between b and c then 1 else 0 end
           
when  0 then case when b<=1 then 1 else 0 end
                   
+case when c>=1 then 1 else 0 end
           
else a+case when b<=1 then 1 else 0 end
               
+case when c>=1 then 1 else 0 end
           
end
        ,周二
=case a
           
when -1 then case when 2 between b and c then 1 else 0 end
           
when  0 then case when b<=2 then 1 else 0 end
                   
+case when c>=2 then 1 else 0 end
           
else a+case when b<=2 then 1 else 0 end
               
+case when c>=2 then 1 else 0 end
           
end
        ,周三
=case a
           
when -1 then case when 3 between b and c then 1 else 0 end
           
when  0 then case when b<=3 then 1 else 0 end
                   
+case when c>=3 then 1 else 0 end
           
else a+case when b<=3 then 1 else 0 end
               
+case when c>=3 then 1 else 0 end
           
end
        ,周四
=case a
           
when -1 then case when 4 between b and c then 1 else 0 end
           
when  0 then case when b<=4 then 1 else 0 end
                   
+case when c>=4 then 1 else 0 end
           
else a+case when b<=4 then 1 else 0 end
               
+case when c>=4 then 1 else 0 end
           
end
        ,周五
=case a
           
when -1 then case when 5 between b and c then 1 else 0 end
           
when  0 then case when b<=5 then 1 else 0 end
                   
+case when c>=5 then 1 else 0 end
           
else a+case when b<=5 then 1 else 0 end
               
+case when c>=5 then 1 else 0 end
           
end
        ,周六
=case a
           
when -1 then case when 6 between b and c then 1 else 0 end
           
when  0 then case when b<=6 then 1 else 0 end
                   
+case when c>=6 then 1 else 0 end
           
else a+case when b<=6 then 1 else 0 end
               
+case when c>=6 then 1 else 0 end
           
end
        ,周日
=case a
           
when -1 then case when 0 between b and c then 1 else 0 end
           
when  0 then case when b<=0 then 1 else 0 end
                   
+case when c>=0 then 1 else 0 end
           
else a+case when b<=0 then 1 else 0 end
               
+case when c>=0 then 1 else 0 end
           
end
   
from(
       
select 跨周数=case when @dt_begin<@dt_end
               
then (datediff(day,@dt_begin,@dt_end)+7)/7
               
else (datediff(day,@dt_end,@dt_begin)+7)/7 end
            ,a
=case when @dt_begin<@dt_end
               
then datediff(week,@dt_begin,@dt_end)-1
               
else datediff(week,@dt_end,@dt_begin)-1 end
            ,b
=case when @dt_begin<@dt_end
               
then (@@datefirst+datepart(weekday,@dt_begin)-1)%7
               
else (@@datefirst+datepart(weekday,@dt_end)-1)%7 end
            ,c
=case when @dt_begin<@dt_end
               
then (@@datefirst+datepart(weekday,@dt_end)-1)%7
               
else (@@datefirst+datepart(weekday,@dt_begin)-1)%7 end)a
)
go

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值