设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 13792|回复: 11
打印 上一主题 下一主题

[Access本身] 通过起止时间,如何计算得到分钟或小时表示的合计工时?

[复制链接]
跳转到指定楼层
1#
发表于 2011-7-8 23:21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
见附件,通过查询能够正确计算,通过自编函数能单计,但不能总计,不如错在哪?有否更简单的方法?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-7-9 03:18:43 | 只看该作者
其实针对上述问题,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放在外面,但相对来说似乎语句更长些。
3#
 楼主| 发表于 2011-7-9 20:44:30 | 只看该作者
版主,用你的方法还是不对啊。
“#错误”问题,将我的查询,在每个字段前加上NZ函数就解决了。
4#
发表于 2011-7-10 06:56:25 | 只看该作者
那就这样改下吧:
SELECT tblGcGZDmx.工作单号, IIf(DateDiff("n",[tblGcGZDmx]![开始时间],[tblGcGZDmx]![结束时间])<0,DateDiff("n",[tblGcGZDmx]![开始时间],[tblGcGZDmx]![结束时间])+1440,DateDiff("n",[tblGcGZDmx]![开始时间],[tblGcGZDmx]![结束时间])) AS 工时
FROM tblGcGZDmx
GROUP BY tblGcGZDmx.工作单号;
5#
 楼主| 发表于 2011-7-10 17:16:11 | 只看该作者
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.工作单号;
已经可以了。但想利用函数简化,不知为什么用在分组总计中不行,提示“表达式中数据类型不匹配”。
6#
发表于 2011-7-10 18:06:25 | 只看该作者
本帖最后由 roych 于 2011-7-10 18:09 编辑

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
7#
发表于 2011-7-10 18:59:58 | 只看该作者
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.工作单号;
8#
发表于 2011-7-10 19:03:25 | 只看该作者
roych 发表于 2011-7-10 18:06
由于存在两种情况。不可能很简化的,除非是长日期(YYYY-MM-DD HH:MM:SS)类型,才可以直接套用DateDiff计算 ...

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

我的意思是,如果格式适当的话,应该是不用IIF嵌套的。
但如果只是时间类型的话,那么系统无法判断是否转钟,IIF语句就不能省却了。
10#
 楼主| 发表于 2011-7-10 22:49:22 | 只看该作者
谢谢两位版主的热心解答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-17 07:31 , Processed in 0.093008 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表