Office中国论坛/Access中国论坛

标题: 这个“结束日期”的公式如何修改? [打印本页]

作者: 明镜    时间: 2008-12-15 23:49
标题: 这个“结束日期”的公式如何修改?
在表中有三个字段,第一个是月,第二个是日,第三个是开始日期(“月”和“日”为数字类型,“开始日期”为日期/时间类型)。然后再做一个查询,目的是查“结束日期”,要求是根据“开始时间”加上“年”和“月”,自动得出“结束日期”,用的公式是“结束日期: DateAdd("d",-1,DateAdd("m",表!月,DateAdd("yyyy",表!年,表!开始日期)))”。但这个公式遇到“开始日期”为2008年2月29日的时候,得出的“结束日期”就比正确的少了一天。请问这个公式如何修改?请高手指点一下。
作者: Henry D. Sy    时间: 2008-12-15 23:56
try:
DateAdd("m",表!月,DateAdd("yyyy",表!年,表!开始日期))-1
作者: 明镜    时间: 2008-12-16 00:07
谢版主,但试了一下,还是原来的问题,能否再想一个办法吗?
作者: Henry D. Sy    时间: 2008-12-16 07:43
DateAdd("yyyy",表!年,DateAdd("m",表!月,表!开始日期))-1
作者: 明镜    时间: 2008-12-16 08:22
试了一下,有时可以用,但有时计算还是出现错误!

[ 本帖最后由 明镜 于 2008-12-16 08:27 编辑 ]
作者: 明镜    时间: 2008-12-16 08:35
如果查询1-3年的少了一天,但查询4年以上的就正确的,有什么办法能解决呢?

传一个附件上来,请高手看一看,
作者: Henry D. Sy    时间: 2008-12-16 08:57
你干脆用天来就算
错误的原因是:你加的只是年数,而你要得到是具体到日(也就是几月几日)。
比如 2008年2月29日,今年是润年明年不是,你加1年,当然是得到 2009-02-28
作者: 明镜    时间: 2008-12-16 10:05
查询的要求是,根据"开始日期"加上"年"和"月"得出结束日期,如开始日期是2007年1月1日加上1年1个月,那么结束日期就应当是2008年1月31日,如加上1年2个月就是2008年2月29日了(是计算实际的年月),
版主说的很对,因为有润年的原因,遇到2月29日就出现问题了.如开始日期为2008年2月29日加上1年应当是2009年2月28日,但查询的结果却是2009年2月27日.这说明这个问题在查询中很难做到,但在VBA中应当可以解决的,但要如何解决确是颇为困难的.
作者: Henry D. Sy    时间: 2008-12-16 10:13
可以这样判断
当开始日期是2月29日,且 月字段为0 时,年数 mod 4 <>0,
则,设计你想要的结果。
作者: Henry D. Sy    时间: 2008-12-16 10:15
记得,
先算增加月,然后算增加年
一般来说,只要月不为0,不会出现错误。
作者: 明镜    时间: 2008-12-16 10:18
谢谢版主提供思路,能否再提供这段VBA?等待中.
作者: Henry D. Sy    时间: 2008-12-16 10:35
先想要的正确结果是如何。
作者: Henry D. Sy    时间: 2008-12-16 11:23
没有测试,
你测试一下,有问题再探讨
  1. Public Function GetEndDate(dtmStartDate As Date, intYear As Integer, intMonth _
  2.                                                                      As Integer) As Date
  3.     Dim strTemp As String
  4.     Dim dtmED As Date

  5.     strTemp = Format(dtmStartDate, "mm-dd")
  6.     dtmED = DateAdd("yyyy", intYear, DateAdd("m", intMonth, dtmStartDate)) - 1

  7.     If strTemp = "02-29" Then
  8.         If intMonth = 0 Then
  9.             If intYear Mod 4 <> 0 Then
  10.                 dtmED = DateAdd("yyyy", intYear, dtmStartDate)
  11.             End If
  12.         End If
  13.     End If

  14.     GetEndDate = dtmED

  15. End Function
复制代码


直接在查询中用IIf也可以,不过性能可能会差些。

[ 本帖最后由 Henry D. Sy 于 2008-12-16 12:19 编辑 ]
作者: Henry D. Sy    时间: 2008-12-16 12:21
SELECT 表.姓名, 表.开始日期, 表.年, 表.月, GetEndDate([开始日期],[年],[月]) AS 表达式1, IIf(Format([开始日期],"mm-dd")<>"02-29",DateAdd("yyyy",[年],DateAdd("m",[月],[表]![开始日期]))-1,IIf([月]=0,IIf([年] Mod 4<>0,DateAdd("yyyy",[年],DateAdd("m",[月],[表]![开始日期])),DateAdd("yyyy",[年],DateAdd("m",[月],[表]![开始日期]))-1),DateAdd("yyyy",[年],DateAdd("m",[月],[表]![开始日期]))-1)) AS 表达式2
FROM 表
作者: 明镜    时间: 2008-12-16 20:05
谢了,   试了一下,   还是没用,   是否直接帮助做到Access中?
作者: Henry D. Sy    时间: 2008-12-16 20:28
什么问题
作者: 明镜    时间: 2008-12-16 22:34
我在窗体上做了"结束日期"的控件,把属性设为更新前,然后运行这段代码,但没显示,是我做得不对,还是其他方面有问题?请指教.
作者: Henry D. Sy    时间: 2008-12-16 22:41
原帖由 明镜 于 2008-12-16 22:34 发表
我在窗体上做了"结束日期"的控件,把属性设为更新前,然后运行这段代码,但没显示,是我做得不对,还是其他方面有问题?请指教.

作者: 明镜    时间: 2008-12-16 23:09
这个上传的文件已基本上可以用了,但就是月份是12个月或者它的倍数时,显示不正确( 少了一天)

[ 本帖最后由 明镜 于 2008-12-16 23:17 编辑 ]
作者: Henry D. Sy    时间: 2008-12-16 23:34
  1. Public Function GetEndDate(dtmStartDate As Date, intYear As Integer, intMonth _
  2.                                                                      As Integer) As Date
  3.     Dim strTemp As String
  4.     Dim dtmED As Date

  5.     strTemp = Format(dtmStartDate, "mm-dd")
  6.     dtmED = DateAdd("yyyy", intYear, DateAdd("m", intMonth, dtmStartDate)) - 1

  7.     If strTemp = "02-29" Then
  8.         If intMonth = 0 Then
  9.             If intYear Mod 4 <> 0 Then
  10.                 dtmED = DateAdd("yyyy", intYear, dtmStartDate)
  11.             End If
  12.         ElseIf intMonth Mod 12 = 0 Then
  13.             dtmED = DateAdd("yyyy", intYear, DateAdd("m", intMonth, _
  14.                                                      dtmStartDate))
  15.         End If
  16.     End If

  17.     GetEndDate = dtmED

  18. End Function
复制代码

[ 本帖最后由 Henry D. Sy 于 2008-12-16 23:36 编辑 ]
作者: ycxchen    时间: 2008-12-17 09:00
我觉得太复杂了,倒不如重新设计表,先定"开始日期",后在查询中设定条件求结束日期
作者: 明镜    时间: 2008-12-17 13:32
感谢版主.通过这个例子,对VBA有所长进.




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