Office中国论坛/Access中国论坛

标题: 通过起止时间,如何计算得到分钟或小时表示的合计工时? [打印本页]

作者: zww3008    时间: 2011-7-8 23:21
标题: 通过起止时间,如何计算得到分钟或小时表示的合计工时?
见附件,通过查询能够正确计算,通过自编函数能单计,但不能总计,不如错在哪?有否更简单的方法?

[attach]46043[/attach]

作者: roych    时间: 2011-7-9 03:18
其实针对上述问题,LZ可以用DateDiff函数来做的:
SELECT tblGcGZDmx.工作单号, Sum(DateDiff("n",[tblGcGZDmx]![开始时间],[tblGcGZDmx]![结束时间])) AS 工时
FROM tblGcGZDmx
GROUP BY tblGcGZDmx.工作单号;
但是,我想提醒的几点是:LZ部分数据有些问题:
1、可能不是标准的日期格式(其实用LZ的自定义函数按工时一列排排序也可以看得到了“#错误”了)。
2、部分结束时间比开始时间还早(用LZ的函数则变成1440-时间差),如果能确认时间无误(那也相当恐怖吧,很多都是23个多小时),用DateDiff时嵌套IIF语句进去修正就可以了(大体可以这样写):
DateDiff("n",IIF([tblGcGZDmx]![开始时间]>[tblGcGZDmx]![结束时间],[tblGcGZDmx]![开始时间]+1440,[tblGcGZDmx]![开始时间]),[tblGcGZDmx]![结束时间])
也可以把IIF放在外面,但相对来说似乎语句更长些。
作者: zww3008    时间: 2011-7-9 20:44
版主,用你的方法还是不对啊。
“#错误”问题,将我的查询,在每个字段前加上NZ函数就解决了。
作者: roych    时间: 2011-7-10 06:56
那就这样改下吧:
SELECT tblGcGZDmx.工作单号, IIf(DateDiff("n",[tblGcGZDmx]![开始时间],[tblGcGZDmx]![结束时间])<0,DateDiff("n",[tblGcGZDmx]![开始时间],[tblGcGZDmx]![结束时间])+1440,DateDiff("n",[tblGcGZDmx]![开始时间],[tblGcGZDmx]![结束时间])) AS 工时
FROM tblGcGZDmx
GROUP BY tblGcGZDmx.工作单号;
作者: zww3008    时间: 2011-7-10 17:16
roych 发表于 2011-7-10 06:56
那就这样改下吧:
SELECT tblGcGZDmx.工作单号, IIf(DateDiff("n",[tblGcGZDmx]![开始时间],[tblGcGZDmx]! ...

我需要的是分组总计,不是单计。这样还是不行。

我的方法:
SELECT tblGcGZDmx.工作单号, Sum(Round(IIf(nz([开始时间])>nz([结束时间]),(1+nz([结束时间])-nz([开始时间]))*1440,(nz([结束时间])-nz([开始时间]))*1440),0)) AS 工时
FROM tblGcGZDmx
GROUP BY tblGcGZDmx.工作单号;
已经可以了。但想利用函数简化,不知为什么用在分组总计中不行,提示“表达式中数据类型不匹配”。
作者: roych    时间: 2011-7-10 18:06
本帖最后由 roych 于 2011-7-10 18:09 编辑

由于存在两种情况。不可能很简化的,除非是长日期(YYYY-MM-DD HH:MM:SS)类型,才可以直接套用DateDiff计算。
详细看看附件吧,之前的SQL语句中忘了加上Sum聚合函数了:
[attach]46053[/attach]


作者: todaynew    时间: 2011-7-10 18:59
zww3008 发表于 2011-7-10 17:16
我需要的是分组总计,不是单计。这样还是不行。

我的方法:

SELECT tblGcGZDmx.工作单号, Sum(IIf(DateDiff("n",[开始时间],[结束时间])<0,DateDiff("n",[开始时间],[结束时间])+24*60,DateDiff("n",[开始时间],[结束时间]))) AS 工时
FROM tblGcGZDmx
GROUP BY tblGcGZDmx.工作单号;

作者: todaynew    时间: 2011-7-10 19:03
roych 发表于 2011-7-10 18:06
由于存在两种情况。不可能很简化的,除非是长日期(YYYY-MM-DD HH:MM:SS)类型,才可以直接套用DateDiff计算 ...

无需(YYYY-MM-DD HH:MM:SS)格式,因为造成负数的原因就是个转钟的问题。所以遇见负数加24×60就完事了。
作者: roych    时间: 2011-7-10 20:34
todaynew 发表于 2011-7-10 19:03
无需(YYYY-MM-DD HH:MM:SS)格式,因为造成负数的原因就是个转钟的问题。所以遇见负数加24×60就完事了。

我的意思是,如果格式适当的话,应该是不用IIF嵌套的。
但如果只是时间类型的话,那么系统无法判断是否转钟,IIF语句就不能省却了。
作者: zww3008    时间: 2011-7-10 22:49
谢谢两位版主的热心解答。
作者: todaynew    时间: 2011-7-11 15:00
roych 发表于 2011-7-10 20:34
我的意思是,如果格式适当的话,应该是不用IIF嵌套的。
但如果只是时间类型的话,那么系统无法判断是否转 ...

也可不用iif嵌套:
SELECT tblGcGZDmx.工作单号, Sum(DateDiff("n",[开始时间],[结束时间])-([开始时间]>[结束时间])*24*60) AS 工时
FROM tblGcGZDmx
GROUP BY tblGcGZDmx.工作单号;
作者: 小何    时间: 2021-3-27 20:23
54752727




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3