我需要更新pdate
(日期字段)不在当前月份和年份的第1天和第20天之间的行。
我正在使用下面编写的代码,但它给出的错误是“预期参数太少”1。我使用MS Access 2007作为数据库。
cn.Execute "update water set prel = (prel + (mmt * (tx / 100))) where pdate not between 1-" & Format$(Now, "MMM") & "-" & Format$(Now, "YYYY") & " and 20-" & Format$(Now, "MMM") & "-" & Format$(Now, "YYYY") & " "
答案 0 :(得分:6)
你的直接问题是缺少#date分隔符,正如@MicSim向你展示的那样。但是我建议你为WHERE子句考虑不同的方法。
添加#分隔符后,您的WHERE子句与此类似(使用今天的日期)。
Debug.Print "WHERE pdate not between #1-" & _
Format$(Now, "MMM") & "-" & Format$(Now, "YYYY") & _
"# and #20-" & Format$(Now, "MMM") & "-" & _
Format$(Now, "YYYY") & "#"
WHERE pdate not between #1-May-2011# and #20-May-2011#
一个重要的问题是您的所有pdate值是否包含午夜作为时间组件。 (日期/时间值总是包含一个时间组件。)这可能是重要的原因是本月应该发生什么样的pdate 5/20/2011 10:18:15 AM?您的WHERE子句将导致更新。但那个日期仍然是5月20日......那就是你想要的吗?
我认为修改后的WHERE子句会产生意外后果的风险较小。
Debug.Print "WHERE pdate < " & _
Format(DateSerial(Year(Date), Month(Date), 1), "\#yyyy-mm-dd#\") & _
" OR pdate >= " & _
Format(DateSerial(Year(Date), Month(Date), 21), "\#yyyy-mm-dd#\")
WHERE pdate < #2011-05-01# OR pdate >= #2011-05-21#
您的问题已标记为vb6。 DateSerial(),Year(),Month(),Date()和Format()函数都应该可以从数据库引擎的沙箱模式中获得。 (见Microsoft's page about sandbox mode functions)。
编辑:感谢@Brian Camire提出此建议。
Debug.Print "WHERE pdate < " & _
"DateSerial(Year(Date), Month(Date), 1)" & _
" OR pdate >= " & _
"DateSerial(Year(Date), Month(Date), 21)"
答案 1 :(得分:2)
您必须使用哈希值或单引号来分隔日期,具体取决于您使用的数据库接口。对ANSI 92或ADO / OLEDB使用散列(#
):
cn.Execute "update water set prel = (prel + (mmt * (tx / 100)))
where pdate not between
#1-" & Format$(Now, "MMM") & "-" & Format$(Now, "YYYY") & "#
and #20-" & Format$(Now, "MMM") & "-" & Format$(Now, "YYYY") & "# "
尽管如此,我建议在这种情况下使用常规格式yyyy-mm-dd hh:mm:ss
或yyyy-mm-dd
。