收录日期:2019/12/07 12:51:00 时间:2016/06/07 20:55:13 标签:ASP
用户输入工作的开始时间和结束时间,自动分配在夜里8点到凌晨8点的加班小时数.
例如:
开始时间: 2006-6-24 22:00:00   结束时间:2006-6-25 10:00:00

得出结果为:10

开始时间: 2006-6-24 22:00:00   结束时间:2006-6-26 6:00:00

得出结果为:22

请问如何能自动求出这个结果?恳请大家帮帮忙,谢谢了 
DateDiff


DateDiff("2006-6-24 22:00:00","2006-6-25 10:00:00")

结果就是
DateDiff 函数
返回两个日期之间的时间间隔。 

DateDiff(interval, date1, date2 [,firstdayofweek[, firstweekofyear]])

DateDiff 函数的语法有以下参数:

参数
interval

必选项。String expression 表示用于计算 date1 和 date2 之间的时间间隔。有关数值,请参阅“设置”部分。

date1, date2

必选项。日期表达式。用于计算的两个日期。

Firstdayofweek

可选项。指定星期中第一天的常数。如果没有指定,则默认为星期日。

Firstweekofyear

可选项。指定一年中第一周的常数。如果没有指定,则默认为 1 月 1 日所在的星期。




DateDiff 函数用于判断在两个日期之间存在的指定时间间隔的数目。例如可以使用 DateDiff 计算两个日期相差的天数,或者当天到当年最后一天之间的星期数。

要计算 date1 和 date2 相差的天数,可以使用“一年的日数”(“y”)或“日”(“d”)。当 interval 为“一周的日数”(“w”)时,DateDiff 返回两个日期之间的星期数。如果 date1 是星期一,则 DateDiff 计算到 date2 之前星期一的数目。此结果包含 date2 而不包含 date1。如果 interval 是“周”(“ww”),则 DateDiff 函数返回日历表中两个日期之间的星期数。函数计算 date1 和 date2 之间星期日的数目。如果 date2 是星期日,DateDiff 将计算 date2,但即使 date1 是星期日,也不会计算 date1。

如果 date1 晚于 date2,则 DateDiff 函数返回负数。

firstdayofweek 参数会对使用“w”和“ww”间隔符号的计算产生影响。

如果 date1 或 date2 是日期文字,则指定的年度会成为日期的固定部分。但是如果 date1 或 date2 被包括在引号 (" ") 中并且省略年份,则在代码中每次计算 date1 或 date2 表达式时,将插入当前年份。这样就可以编写适用于不同年份的程序代码。

在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份。

下面的示例利用 DateDiff 函数显示今天与给定日期之间间隔天数: 

Function DiffADate(theDate)
  DiffADate = "从当天开始的天数:" & DateDiff("d", Now, theDate)
End Function
不错,巳经有两位高人说出口了,我来抢个座了,楼主顺便给点分啦
不是上面两位所说的,请注意我的第2句话:自动分配在夜里8点到凌晨8点的加班小时数.

是要统计从20:00到凌晨8点之间的小时数
<%
Date1 = CDate("2006-6-24 22:00:00") '用户输入的开始时间
Date2 = CDate("2006-6-26 6:00:00") '用户输入的结束时间
DateStart = FormatDateTime(Date1, 2)&" 20:00:00" '起效时间开始
DateEnd = FormatDateTime(Date2, 2)&" 8:00:00" '起效时间结束
If DateDiff("h", Date1, DateStart)<0 Then
  DateStart = Date1
End If
If DateDiff("h", DateEnd, Date2)<0 Then
  DateEnd = Date2
End If
DateNum = DateDiff("h", DateStart, DateEnd)
If DateNum>12 Then
  DateNum = DateNum-(DateDiff("d", Date1, Date2)-1)*12
End If
Response.Write DateNum '得到小时数
%>
楼主的意思是说,08:00 - 18:00 之间不计算为加班时间对吧?
这个也很简单嘛。
不知道楼主要不要考虑分钟数?如果只是精确到小时数,又简单一些。
你可以换个思路,用总小时数,减去正常上班小时数。

给你写个最简单但不是最优的算法吧:

Function getOverHours(TimeBegin,TimeEnd)
    dim ms,i,d : ms=0 : d=#2000-01-01#
    For i=DateDiff("n", d, TimeBegin) to DateDiff("n", d, TimeEnd)
        If (i mod 1440)<480 or (i mod 1440)>1080 Then ms = ms +1
    Next
    getOverHours = (ms/60)
End Function

document.writeln getOverHours("2006-6-24 22:00:00","2006-6-25 10:00:00")
document.writeln getOverHours("2006-6-24 22:00:00","2006-6-26 06:00:00")
datediff("h","2006-6-24 22:00:00","2006-6-26 6:00:00")
或者这样吧.只要小时数在非加班时间,那就强定义为加班开始时间
<%
Function getHourNum(d1,d2)
  If IsDate(d1)=True And IsDate(d2)=True Then
    If Hour(d1)>8 And Hour(d1)<20 Then d1 = FormatDateTime(d1,2)&" 20:"&Minute(d1)&":"&Second(d1)
    If Hour(d2)>8 And Hour(d2)<20 Then d2 = FormatDateTime(d2,2)&" 8:"&Minute(d1)&":"&Second(d1)
    If Hour(d2)<24 And Hour(d2)>20 Then d2 = DateAdd("d",d2,1)&" 8:"&Minute(d1)&":"&Second(d1)
    If DateDiff("d",d1,d2)>1 Then AddDate = 12*(DateDiff("d",d1,d2)-1)
    getHourNum = DateDiff("h",d1,d2)-AddDate
  End If
End Function
Date1 = "2006-6-24 22:00:00" '用户输入的开始时间
Date2 = "2006-6-26 6:00:00" '用户输入的结束时间
Response.Write getHourNum(Date1,Date2)
%>
测试了,都不可以呀:(

Function getHourNum(d1,d2)
  If IsDate(d1)=True And IsDate(d2)=True Then
    If Hour(d1)>8 And Hour(d1)<20 Then d1 = FormatDateTime(d1,2)&" 22:"&Minute(d1)&":"&Second(d1)
    If Hour(d2)>8 And Hour(d2)<20 Then d2 = FormatDateTime(d2,2)&" 1:"&Minute(d1)&":"&Second(d1)
    If Hour(d2)<24 And Hour(d2)>20 Then d2 = DateAdd("d",d2,1)&" 1:"&Minute(d1)&":"&Second(d1)
    If DateDiff("d",d1,d2)>1 Then AddDate = 12*(DateDiff("d",d1,d2)-1)
    getHourNum = DateDiff("h",d1,d2)-AddDate
  End If
End Function
Date1 = "2006-6-24 22:00:00" '用户输入的开始时间
Date2 = "2006-6-26 6:00:00" '用户输入的结束时间
Response.Write getHourNum(Date1,Date2)

我以22:00到凌晨1点为加班时间做测试,实际从开始时间到结束时间在这个时间段里的只有6个小时。也就是:
6月24日的22点----6月24日23点
6月24日的23点----6月25日0点
6月25日的0点-----6月25日的1点

6月25日的22点----6月25日23点
6月25日的23点----6月26日0点
6月26日的0点-----6月26日的1点

可是输出是20,怎么办,哭~~
按照你的描述,从晚8点到早8点是加班时间.我经过测试是正确的.
Date1 是开始时间
Date2 是结束时间
照搬代码,当然输出是20了
自己修改了看看.
Date1 = "2006-6-24 22:00:00" '用户输入的开始时间
Date2 = "2006-6-25 1:00:00" '用户输入的结束时间
看上去很不好办,其实很简单。tim1是上班时间,tim2是下班时间

第一步。,我们先把时间全加上4小时,就变成从0点到12点为加班时间了,
t1=dateadd(day,4,tim1)
t2=dateadd(day,4,tim2)
然后对取小时数
第二步得出同一天加班时间:
h1=Hour(tim1)
h2=Hour(tim2)
我们会得出同一天加班时间为: n = IIf(h1 < 12, 12 - h1, 0) - IIf(h2 < 12, 12 - h2, 0)
第三步:效正一下
如果不同天,可能为负数,我们不管他是正是负,都在后面加上:
我们在不管他,在后面加上DateDiff("d", t1, t2) * 12

OK,。这就是你要的结果,如果要简单的话,你只需要一句话搞定
IIf(Hour(DateAdd("h", 4, tim1)) < 12, 12 - Hour(DateAdd("h", 4, tim2)), 0) - IIf(Hour(DateAdd("h", 4, tim2)) < 12, 12 - Hour(DateAdd("h", 4, tim2)), 0) + DateDiff("d", DateAdd("h", 4, tim1), DateAdd("h", 4, tim2)) * 12
还说明一下,如果是在数据库中使用的话更简单了,SQL脚本中有交集这一概念
我把起效时间修改了,改成夜里22:00到凌晨1点,如下:
DateStart = FormatDateTime(Date1, 2)&" 22:00:00" '起效时间开始
DateEnd = FormatDateTime(Date2, 2)&" 1:00:00" '起效时间结束

再把用户输入的时间修改如下
Date1 = "2006-6-24 22:00:00" '用户输入的开始时间
Date2 = "2006-6-26 6:00:00" '用户输入的结束时间

实际结果应该为6个小时.
但是输出却是15.

这可怎么办-_-
fl99(笨笨) 

那些时间都是从数据库输出的,请问该怎么用交集呀?这个我不太会...
我是按照你给的晚8点到早8点是加班时间算的.

你现在这个的要求变成为 每天的晚8点到凌晨1点是加班时间了.
还没能解决?哪位高人指点一下啊~~~~~~~~~
'08:00 - 18:00 之间不计算为加班时间
Function getOverHours(TimeBegin,TimeEnd)
    dim ms,i,d : ms=0 : d=#2000-01-01#
    For i=DateDiff("n", d, TimeBegin) to DateDiff("n", d, TimeEnd)
        If (i mod 1440)<480 or (i mod 1440)>1080 Then ms = ms +1
    Next
    getOverHours = (ms/60)
End Function

document.writeln getOverHours("2006-6-24 22:00:00","2006-6-25 10:00:00")
document.writeln getOverHours("2006-6-24 22:00:00","2006-6-26 06:00:00")
'd1 考查的开始时间 例如 2006-6-24 22:00:00 
'd2 考查的终止时间 例如 2006-6-26 6:00:00  
'start 设定每天加班开始时间 例如 22:00:00
'interval 设定每天加班时间长度,单位小时 例如 22:00:00~1:00:00 是3小时

Function getOverTime(d1,d2,start,interval)
  dim sum
  sum=0
  For d = day(d1) To day(d2)
      currentS=DateAdd("d",d-day(d1),CDate(FormatDateTime(d1,2)&" "&start))
      currentE=DateAdd("h",interval,CDate(currentS))
    document.write currentS 
      if DateDiff("h",d1,currentS)>=0 and DateDiff("h",d1,currentE)>=0 and DateDiff("h",d2,currentS)<=0 and DateDiff("h",d2,currentE)<=0 then 
      sum=sum+interval
    
      else if DateDiff("h",d1,currentS)<=0 and DateDiff("h",d1,currentE)>=0 and DateDiff("h",d2,currentS)<=0 and DateDiff("h",d2,currentE)<=0 then 
      sum=sum+DateDiff("h",d1,currentE)

      else if DateDiff("h",d1,currentS)>=0 and DateDiff("h",d1,currentE)>=0 and DateDiff("h",d2,currentS)<=0 and DateDiff("h",d2,currentE)>=0 then
      sum=sum+DateDiff("h",currentS,d2)

    end if
  end if
end if

  Next
getOverTime=sum
end Function

Date1 = "2006-6-24 22:00:00" '用户输入的开始时间
Date2 = "2006-6-26 6:00:00"  '用户输入的结束时间

Response.Write getOverTime(Date1,Date2,"22:00:00",3)
不好意思
上面的去掉这一行
document.write currentS

重写一遍:

Function getOverTime(d1,d2,start,interval)
  dim sum
  sum=0
  For d = day(d1) To day(d2)
      currentS=DateAdd("d",d-day(d1),CDate(FormatDateTime(d1,2)&" "&start))
      currentE=DateAdd("h",interval,CDate(currentS))
      if DateDiff("h",d1,currentS)>=0 and DateDiff("h",d1,currentE)>=0 and DateDiff("h",d2,currentS)<=0 and DateDiff("h",d2,currentE)<=0 then 
      sum=sum+interval
      else if DateDiff("h",d1,currentS)<=0 and DateDiff("h",d1,currentE)>=0 and DateDiff("h",d2,currentS)<=0 and DateDiff("h",d2,currentE)<=0 then 
      sum=sum+DateDiff("h",d1,currentE)
      else if DateDiff("h",d1,currentS)>=0 and DateDiff("h",d1,currentE)>=0 and DateDiff("h",d2,currentS)<=0 and DateDiff("h",d2,currentE)>=0 then
      sum=sum+DateDiff("h",currentS,d2)
    end if
  end if
end if
  Next
getOverTime=sum
end Function

Date1 = "2006-6-24 22:00:00" 
Date2 = "2006-6-26 6:00:00"  

'通过start 和interval设定"起效时间" 
'又例如 22:00:00~2:00:00 4小时

Response.Write getOverTime(Date1,Date2,"22:00:00",4)



楼主这个问题就是送分的
该说的楼上的都说了
我来接分
^_^
IIf(Hour(DateAdd("h", 4, tim1)) < 12, 12 - Hour(DateAdd("h", 4, tim1)), 0) - IIf(Hour(DateAdd("h", 4, tim2)) < 12, 12 - Hour(DateAdd("h", 4, tim2)), 0) + DateDiff("d", DateAdd("h", 4, tim1), DateAdd("h", 4, tim2)) * 12
yourantian() ( ) 信誉:100  2006-06-25 02:44:00  得分: 0  
   我把起效时间修改了,改成夜里22:00到凌晨1点,如下:
DateStart = FormatDateTime(Date1, 2)&" 22:00:00" '起效时间开始
DateEnd = FormatDateTime(Date2, 2)&" 1:00:00" '起效时间结束
再把用户输入的时间修改如下
Date1 = "2006-6-24 22:00:00" '用户输入的开始时间
Date2 = "2006-6-26 6:00:00" '用户输入的结束时间
实际结果应该为6个小时.
但是输出却是15.

这可怎么办-_-

  

输出是20小时,
实际是2小时(24号)+12小时(25号)+6小时(26号)=20小时,
没有错误。
 
到我这里还有分没啦?

python怎么调用exe,带参数的. 留个QQ号,欢迎mm们加 大家来讨论讨论程序架构的问题,最后100分了 csdn连此问题都解决不了吗???? 光棍还这么倒霉 Mysql的MyIsam COUNT问题 升个裤衩难。 c# iTextSharp word转pdf SSIS Oracle 参数问题 文字处理系统的国内外研究动态 谁能帮我找到双色球和值的组合号码软件? 用C#解决PDA从服务器下载指定文件问题 图片双缓冲 文字处理系统的国内外研究动态 C# 多线程编程 点击按钮,保存时间 JAVA Swing 布局求助 有哪位高手见过这个问题呀 跪求解决 请问!如何画一矩形(固定大小)随鼠移动 站内搜索 怎么按准确度排序 求助:IE 浏览器主页被修改,怎么也改不回来 ext总是去执行success 关于套接字接收数据的问题 绘图完成后窗口最小化后图会消失 如何理解控件里itemindex属性? QQZone 图片上传插件的问题 请教个关于SQL递归排序的方法 Eclipse怎么添加插件???? asp 更新一个表多条记录,在插入另一个表记录 求助,想在SQL2000里面写一个update触发器,找不着思路。帮帮忙,有表的结构