日期型变量具有一些与文本型与数字型变量不同特性.docVIP

  • 5
  • 0
  • 约5.67千字
  • 约 3页
  • 2017-08-06 发布于河南
  • 举报

日期型变量具有一些与文本型与数字型变量不同特性.doc

日期型变量具有一些与文本型与数字型变量不同特性

日期型变量具有一些与文本型和数字型变量不同的特性,对于初学者来说处理日期型变量容易犯迷糊。这两日在为版友版友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)-(xint(x)),如果x是一个带有小数的值,那么xint(x)就为True,也就是-1。因此-(xint(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

文档评论(0)

1亿VIP精品文档

相关文档