Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-教程

【access小品】对于时间的NZ与IIF

时 间:2011-07-11 16:33:14
作 者:煮江品茶   ID:10802  城市:武汉
摘 要:对于时间的NZ与IIF
正 文:

  日期型变量具有一些与文本型和数字型变量不同的特性,对于初学者来说处理日期型变量容易犯迷糊。这两日在为版友版友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



Access软件网官方交流QQ群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助