日期范围在带有ms访问数据库的vb中不起作用

时间:2011-05-25 14:26:00

标签: sql ms-access vb6

我需要更新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") & " "

2 个答案:

答案 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:ssyyyy-mm-dd