首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求一个sql函数:计算时间差(除周六和周日外)的天数 [已结帖,结帖人:chenjf2k]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenjf2k
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2007-03-22 12:00:09 楼主
    如题,

    请高手帮忙一下,应该有人遇到过这个问题吧?

    感谢!
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mengmou
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-03-22 12:02:061楼 得分:50
    if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[dbo].[f_WorkDay] ')   and   xtype   in   (N 'FN ',   N 'IF ',   N 'TF '))
    drop   function   [dbo].[f_WorkDay]
    GO

    --计算两个日期相差的工作天数
    CREATE   FUNCTION   f_WorkDay(
    @dt_begin   datetime,     --计算的开始日期
    @dt_end     datetime         --计算的结束日期
    )RETURNS   int
    AS
    BEGIN
                DECLARE   @workday   int,@i   int,@bz   bit,@dt   datetime
                IF   @dt_begin> @dt_end
                            SELECT   @bz=1,@dt=@dt_begin,@dt_begin=@dt_end,@dt_end=@dt
                ELSE
                            SET   @bz=0
                SELECT   @i=DATEDIFF(Day,@dt_begin,@dt_end)+1,
                            @workday=@i/7*5,
                            @dt_begin=DATEADD(Day,@i/7*7,@dt_begin)
                WHILE   @dt_begin <=@dt_end
                BEGIN
                            SELECT   @workday=CASE  
                                        WHEN   (@@DATEFIRST+DATEPART(Weekday,@dt_begin)-1)%7   BETWEEN   1   AND   5
                                        THEN   @workday+1   ELSE   @workday   END,
                                        @dt_begin=@dt_begin+1
                END
                RETURN(CASE   WHEN   @bz=1   THEN   -@workday   ELSE   @workday   END)
    END
    GO
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mengmou
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-03-22 12:02:202楼 得分:0
    版权归邹老大所有。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • playwarcraft
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-03-22 12:17:283楼 得分:50
    create   function   fn_test(@begin   datetime,@end   datetime)
    returns   int
    As
    BEGIN
    declare   @i   int,@j   int
    set   @i=0
    set   @j=0
    if   @end> @begin
      begin
                  while   dateadd(d,@i,@begin) <=@end
                            begin
                                        if   datepart(weekday,dateadd(d,@i,@begin))   not   in(1,7)
                                                  set   @j=@j+1
                                        set   @i=@i+1
                              end
        end
     
    return   @j

    END
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenjf2k
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-03-22 13:29:284楼 得分:0
    感谢楼上两位,我这两天会用到,到时有问题再请教你们,,谢谢!
    结帐先!
    修改 删除 举报 引用 回复