设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3746|回复: 5
打印 上一主题 下一主题

[Access本身] 【Access小品】对于时间的NZ与IIF

[复制链接]
跳转到指定楼层
1#
发表于 2011-7-11 16:36:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  日期型变量具有一些与文本型和数字型变量不同的特性,对于初学者来说处理日期型变量容易犯迷糊。这两日在为版友版友zww3008同志和宋雄健同志解决相关问题时,涉及到日期型变量的两个常见的问题。关于这两个问题的处理有一定的典型意义,于是写此文以期能对其他初学者提供参考。

  版友zww3008 同志关于工时的数据表中将日期和时间分为不同字段处理,于是在统计工时的时候就产生了一个转钟的麻烦,使得某些记录的开始时间大于了结束时间。解决这个问题首先可以想到的是用iif函数,可以写成如下:

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

  这样写有个问题,就是公式书写比较复杂,有些眼花缭乱。有没有相对简洁一些的写法呢?答案是肯定的。在给出答案前,需要说明一个基本算法。逻辑值有个特点,就是True=-1,False=0。其中True=-1这个特点非常有意思,可以利用这个特点,可以得到一些特殊的算法。比如向上取整的问题,我们可以这样写:int(x)-(x>int(x)),如果x是一个带有小数的值,那么x>int(x)就为True,也就是-1。因此-(x>int(x)就为1,这样的一个算式就达到了向上取整的目的。有了这么个阐述,版友zww3008 同志的问题就可以这样解决了:

Select 工作单号, Sum(DateDiff("n",[开始时间],[结束时间])-([开始时间]>[结束时间])*24*60) AS 工时
FROM tblGcGZDmx
GROUP BY 工作单号;

  版友宋雄健同志弄了一个刷卡表,为了防止员工重复刷卡,希望能在某个员工刷卡后的5分钟内,禁止重复刷卡。为此给他写了一个自定义函数。这个函数很简单,不是讨论的重点。重点在于日期型变量如何使用Nz函数的问题。Nz函数主要用于解决变量为null的情形,我们比较常用的是在变量为null将其取为0或"",这是解决数值型和文本型变量的基本用法。可是对于日期型,就不能这样个搞法了。实际上nz函数的第二个参数,除了可以设置为0和""外,也可以设置为其他的值。也就是说,我们完全可以根据特定的要求,将这个参数设定为特定的值。
  
  就宋雄健同志问题来看,是需要用Dlast来取得某个员工最后一次刷卡的时间做为判断的基础。但是Dlast第一次使用时,其值为null。这个时候就需要用Nz函数对第一次的取值进行设置了,按照问题来看,设置Nz函数的第二个参数,应该为DateAdd("n", -5, Now())。

Function B(str As String) As Boolean
Dim t As Date
t = Nz(DLast("刷卡时间", "刷卡表", "员工编号='" & str & "'"), DateAdd("n", -5, Now()))
B = False
If DateDiff("n", t, Now()) < 5 And Me.List4.ListCount <> 0 Then
    Me.员工编号.Value = Null
    B = True
End If
End Function
  
  类似的应用还可以在以时间为基础的自动编码方面,比如说要按照每日从001自动编码,那么我们可以将自动编码写为:

Function Num(D as Date) as string
dim str as string
str=Nz(Dmax("编码","表1","日期=#" & D & "#"),D & "000")
str=Format(Right(str,3)+1,"000")
str=D & str
Num=str
End Function

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-7-11 21:40:32 | 只看该作者
谢谢todaynew ,这样就简单多了。todaynew 版主总是能给出一些另辟径溪的思路,很受益。
3#
发表于 2011-7-12 09:02:16 | 只看该作者
学习了
4#
发表于 2011-7-12 10:05:40 | 只看该作者
受益, 谢谢
5#
发表于 2011-7-12 19:32:22 | 只看该作者
有意思,挺典型的,先收藏了。
6#
发表于 2011-7-31 08:54:16 | 只看该作者
细微之处见真功
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-11 06:05 , Processed in 0.094883 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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