диапазон дат не работает в VB с базой данных MS Access - PullRequest
3 голосов
/ 25 мая 2011

Мне нужно обновить строки, где 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 ]

6 голосов
/ 25 мая 2011

Ваша непосредственная проблема - отсутствующие # разделители даты, как показывал @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 полночь в качестве компонента времени. (Значения даты / времени всегда включают компонент времени.) Причина, по которой это может иметь значение, заключается в том, что должно произойти в этом месяце с датой 20.05.2011 10:18:15? Ваше предложение WHERE приведет к обновлению. Но эта дата все еще 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 о функциях режима песочницы ).

Редактировать : Спасибо @Brian Camire за это предложение.

Debug.Print "WHERE pdate < " & _
    "DateSerial(Year(Date), Month(Date), 1)" & _
    " OR pdate >= " & _
    "DateSerial(Year(Date), Month(Date), 21)"
2 голосов
/ 25 мая 2011

Вы должны разделять даты с помощью хэшей или одинарных кавычек, в зависимости от того, какой интерфейс базы данных вы используете. Используйте хеши (#) для 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...