zoukankan      html  css  js  c++  java
  • SQL计算实际工作日(天)及两个时间(工作日)间隔(小时)!

    Code highlighting produced by Actipro CodeHighlighter (freeware)-->去掉法定节假日(周六,周天)和指定节假日
    USE [DBName]
    GO
    /****** 对象:  Table [dbo].[T_SYS_Holiday]    脚本日期: 11/08/2010 16:04:27 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    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
    SET ANSI_PADDING OFF
    
    表记录示例:
    国庆节 2010-10-1 0:00:00 节假日
    国庆补班 2010-9-26 0:00:00 非节假日
    国庆补班 2010-10-9 0:00:00 非节假日
    国庆 2010-10-2 0:00:00 节假日
    国庆 2010-10-3 0:00:00 节假日
    国庆 2010-10-4 0:00:00 节假日
    国庆 2010-10-5 0:00:00 节假日
    国庆 2010-10-6 0:00:00 节假日
    国庆 2010-10-7 0:00:00 节假日
    中秋补班 2010-9-19 0:00:00 非节假日
    中秋补班 2010-9-25 0:00:00 非节假日
    中秋 2010-9-22 0:00:00 节假日
    中秋 2010-9-23 0:00:00 节假日
    中秋 2010-9-24 0:00:00 节假日
    
    
    --计算实际工作日(单位:天)
    create   FUNCTION   [dbo].[fn_WorkDay]( 
    @dt_begin   datetime,     --计算的开始日期 
    @dt_end     datetime         --计算的结束日期 
    )RETURNS   int 
    AS 
    BEGIN 
    DECLARE   @workday 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
    set  @workday=0 
     WHILE   @dt_begin+1<=@dt_end 
      BEGIN 
       SELECT   @workday=CASE   
       WHEN   ((((@@DATEFIRST+DATEPART(Weekday,@dt_begin)-1)%7   BETWEEN   1   AND   5 )or @dt_begin in(
        select Hdate from t_sys_holiday where isholiday='非节假日'
        )) 
         and (@dt_begin not in(select Hdate from t_sys_holiday where isholiday='节假日')))
       THEN   @workday+1   ELSE   @workday   END, 
       @dt_begin=@dt_begin+1 
      END 
    RETURN(CASE   WHEN   @bz=1   THEN   -@workday   ELSE   @workday   END) 
    END 
    
     
    
    --计算实际工作时间(单位:小时)
    create   FUNCTION   [dbo].[fn_WorkHour]( 
    @dt_begin   datetime,     --计算的开始日期 
    @dt_end     datetime         --计算的结束日期 
    )RETURNS   int 
    AS 
    BEGIN 
    DECLARE   @workhour int,@workday int,@bz   bit,@dt   datetime ,@memorybegin_dt datetime
    IF   @dt_begin> @dt_end 
      SELECT   @bz=1,@dt=@dt_begin,@dt_begin=@dt_end,@dt_end=@dt 
    ELSE 
     SET   @bz=0
     set  @workhour=0 
     SET  @workday=0
     SET @memorybegin_dt=@dt_begin
     WHILE   dateadd(hh,0,dateadd(hh,1,@dt_begin))<=@dt_end 
      BEGIN 
       SELECT   @workhour=CASE   
       WHEN   ((((@@DATEFIRST+DATEPART(Weekday,@dt_begin)-1)%7   BETWEEN   1   AND   5 )or @dt_begin in(
        select Hdate from t_sys_holiday where isholiday='非节假日'
        ))  and (@dt_begin not in(select Hdate from t_sys_holiday where isholiday='节假日')))
       THEN   @workhour+1   ELSE   @workhour   END
       set @dt_begin=dateadd(hh,0,dateadd(hh,1,@dt_begin))  
     END 
     set @workhour=@workhour--datediff(hh,@memorybegin_dt+@workday,@dt_end)
    RETURN(CASE   WHEN   @bz=1   THEN   -@workhour   ELSE   @workhour   END) 
    END 
    
    
    
    select dbo.fn_WorkDay('2010-11-04 09:09:09','2010-11-05 09:09:09') --1
    select dbo.fn_WorkDay('2010-11-04 09:09:09','2010-11-06 09:09:09') --2
    select dbo.fn_WorkDay('2010-11-04 09:09:09','2010-11-07 09:09:09') --2
    select dbo.fn_WorkDay('2010-11-04 09:09:09','2010-11-08 09:09:09') --2
    
    select dbo.[fn_WorkHour]('2010-11-04 09:09:09','2010-11-05 09:09:09')--24
    select dbo.[fn_WorkHour]('2010-11-04 09:09:09','2010-11-06 09:09:09')--39
    select dbo.[fn_WorkHour]('2010-11-04 09:09:09','2010-11-07 09:09:09')--39
    select dbo.[fn_WorkHour]('2010-11-04 09:09:09','2010-11-08 09:09:09')--48
    屌丝一直很屌
  • 相关阅读:
    java Semaphore的介绍和使用
    java CyclicBarrier的介绍和使用
    java CountDownLatch 使用介绍
    android模拟器不能上网设置
    计算几何题集
    BZOJ1004: [HNOI2008]Cards
    BZOJ1029: [JSOI2007]建筑抢修
    BZOJ1037: [ZJOI2008]生日聚会Party
    BZOJ1083: [SCOI2005]繁忙的都市
    Java开发笔记(一百一十四)利用Socket传输文本消息
  • 原文地址:https://www.cnblogs.com/xiashenbin/p/3549770.html
Copyright © 2011-2022 走看看