可能看标题你还是不太懂我在讲什么,我们设定一个场景,假如一天老板叫你为他统计在06年圣诞节(2006-12-25)
至07年情人节(2007-02-14)这段时间创建的,处理了超过七天半(7.5个工作日)的客诉的数量,你如何操作呢?
首先我们说超过7.5个工作日,就是要减去周六和周日后的天数,再者,超过了7.5天,也就是说处理时间有可能是8.4,10.2,13.1等等,诸如此类了。
以下就是我的处理方法:
假设数据库里有记录客诉的创建时间(BeginDate)和结束时间(EndDate),我们在查询语句中就可以这样写:
Sql = "SELECT ... FROM ... WHERE BeginDate between ‘2006-12-25‘ and
‘2007-02-14‘
"
+"
and DATEDIFF(hh, BeginDate, EndDate) -
"
+"(DATEDIFF(day,DATEADD(wk, DATEDIFF(wk,0,BeginDate),
0),getdate())/7"
+" - DATEDIFF(day,DATEADD(wk, DATEDIFF(wk,0,EndDate), 0),getdate())/7)*2*24
〉7.5*24";
我来分析一下这个查询语句:
BeginDate
between ‘2006-12-25‘ and
‘2007-02-14‘ 应该很好理解,提取出规定日期的数据行。
DATEDIFF(hh, BeginDate,
EndDate) 计算两个日期之间总的小时数,为了方便说明,我们这里取个别名叫“A”。注意,这里要换算成为小时,原因你也可以先思考下。^^
DATEDIFF(day,DATEADD(wk,
DATEDIFF(wk,0,BeginDate), 0),getdate())/7的意思是让当前时间去减去创建时间所在星期的星期一的天数,然后再整除7,等到间隔的星期数。我们这里也取个别名叫“B”。
同理可得,DATEDIFF(day,DATEADD(wk,
DATEDIFF(wk,0,EndDate), 0),getdate())/7的意思是让当前时间去减去结束时间所在星期的星期一的天数,然后再整除7,等到间隔的星期数。我们这里也取个别名叫“C”。
好了,该查询语句的原型就是:
A -
(B-C)*2*24 〉7.5*24
(B-C)*2*24::B-C就是两个时间之间的星期数了,*2*24就是将这些星期换算为小时数,这样才能和A进行计算的。7.5*24原理也是一样。
结束语:
该语句的适用环境是开始时间和结束时间都必须在工作日发生的情况下,毕竟一些事情必须是在工作时才能处理的,而且不能处理特定节假日,例如五一、国庆放假等等,单靠一句SQL的确很难完成所有工作,不过可以将条件进行分类,形成多条SQL,然后用Union将其串起来,这只是我的初步想法,如果你有更优秀的办法,望能交流。^^