收录日期:2020/06/02 13:32:55 时间: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小时,
没有错误。
 
到我这里还有分没啦?

ACM Vol1_100,请帮忙 编译servlet的问题 初学者的问题,在线等 网站大规模分类 比较三种分类的数据库设计?分不够再加100! combobox的文本为什么总是倒着输入? 请教 图片问题 做java这行有两年工作经验的能拿都少啊? 大侠帮帮忙,AfxGetMainWnd()和GetParent()得到的指针的区别? 如何用asp调用水晶报表 读取数据时如何做LOADING界面 哪里有Delphi7.1下载???? 《JAVA大学教程英文版第四版》值不值得买?? 哪里有Delphi7.1下载???? 如果有一个列表框是可多选的,如何得到所有的选中项? 四级答案 关于带参数运行的问题! 抵制日本软件,一定!!! 六级答案 老实说了吧,作业题,明天就要交了,急用!哪为好心人帮帮我5555555555。 eclipse3M8 build project的简单问题 SQL> sqlldr userid=system/manager@ mingal control=input.ctl这错在哪? 为什么我的电脑经常会光标定在那里一会儿不动,马上就好了啊??(未解决!!!!!) 硬盘分区打不开,恳请大家帮帮小弟,不胜感激! 丑陋的CString 如何设置让木马程序读取无效 学习《深入浅出mfc》,大家有什么感想? 问一个关于字体的问题? 能像读文本文件(.txt)一样读取word吗? 如何使用try及catch