Я надеюсь, что меня простят за незначительное нарушение правил, когда я спрашиваю причину, а не решение.
У меня такой код:
INSERT INTO destinationTable (RecordMonth, ...)
SELECT t1.Expr1, ...
FROM
(
SELECT
CDate(Format("01-" & Right([t1].[Year-Month],2) & "-" & Left([t1].[Year-Month],4),"dd/mm/yyyy")) AS Expr1,
/* ...other fields with no bearing... */
FROM tcsvMonthData AS t1
)
WHERE t1.Expr1 >= DateAdd("m",-6,(SELECT MAX(Expr1) FROM t1))
[Year-Month] в t1 - это поле типа varchar.
Этот сценарий завершается ошибкой, Access выдает следующее сообщение об ошибке: «Несоответствие типа данных в выражении критерия».
Если я удалю блок CDate, скрипт заработает. Рад, что нашел ответ, но я не понимаю, почему вообще возникает ошибка. CDate ограничивает поле типом даты. После format поле уже должно быть типом даты, поэтому CDate избыточен, но он не должен навредить (по крайней мере, в моей голове). Кроме того, насколько мне известно, DateAdd, в отличие, скажем, от Year, не преобразует поле ввода в строку, он должен поддерживать тип даты. и так, что здесь происходит?
Обновлено:
Year-Month описывает месяц, в котором произошла запись, и выглядит так: 2017-11. Это тип varchar, и цель состоит в том, чтобы сделать его правильным полем datetime в формате дд / мм / гггг, где каждый месяц представлен первым днем этого месяца. Итак, май - 01.05.2018 и т. д.


Я нашел решение на сервере sql, пожалуйста, используйте cdate вместо cast для доступа к ms.
select cast(format(cast('01-' + left('07/23/2018',2) + '-' + right('07/23/2018',4) as date),'dd/MM/yyyy') as date) AS Expr1
измените статическую дату в столбце.
Как это поможет с MS-Access?
Я очень ценю, что вы столкнулись с проблемой поиска решения, которое работает для Sql Server, однако мой вопрос здесь не «как мне это исправить?» а скорее «почему это не удается?». Причина, по которой я спрашиваю, состоит в том, чтобы лучше понять, как работает Access, чтобы я мог избежать подобных проблем в будущем.
Прошло много времени с тех пор, как мне приходилось использовать Access, но я думаю, что проблема не в том, что вы используете CDate (), а скорее в использовании Format () во внутренней строке. Format () должен работать с датой, но вы даете ей строку. Поскольку Format не работает, окружающий CDate () также не работает.
Вам нужно использовать CDate () перед Format () следующим образом:
Format(CDate ("01-" & Right([t1].[Year-Month],2) & "-" & Left([t1].[Year-Month],4),"dd/mm/yyyy")) AS Expr1,
Возможно, вам придется внести некоторые изменения, чтобы заставить это работать, но основная идея должна работать.
Отклоненный ответ ниже работает, потому что Cast As Date (который функционально эквивалентен CDate) используется как до, так и после Format (), поэтому Format () передает Date. Второй состав в этом примере является избыточным.
Я пробовал, но, честно говоря, это работает наоборот. Если я помещаю CDate в Format, то конечным результатом будет поле строкового типа, и последующий DateAdd также не работает. В качестве небольшого примечания, я считать, ваша скобка не в нужном месте. CDate должен быть закрыт раньше "dd/mm/yyyy", верно?
Да, Format () принимает дату и возвращает строку в указанном формате. В Access дата хранится как временной код, который не читается человеком. Итак, в исходном примере вы берете дату строки, конвертируете ее во временной код, а затем используете Format () для преобразования обратно в строку с другим форматом. Если вы просто хотите сохранить дату, вы можете полностью пропустить Format ().
Вы серьезно усложняете это. CDate - это все, что вам нужно:
CDate([t1].[Year-Month]) AS Expr1
Редактировать:
Чтобы принять значения Ноль, либо отфильтруйте их, либо используйте CVDate для передачи Ноль:
CVDate([t1].[Year-Month]) AS Expr1
или укажите значение по умолчанию, используя Nz:
Nz(CVDate([t1].[Year-Month]), Date()) AS Expr1
Правда! Еще одна функция, которая упрощает все испытания, - это DateValue, но все они так или иначе терпят неудачу. Предлагаемое вами решение вызывает следующее сообщение об ошибке «недопустимое использование нуля». Я проверю, не наделал ли я какой-то другой беспорядок, экспериментируя с решениями, которые были здесь предложены, но я начинаю подозревать, что проблема на самом деле связана с функцией DateAdd.
CDate не «терпит неудачу», но он не принимает значения Ноль в качестве входных данных.
Бинго! Year-Month не должен быть нулевым, поэтому я даже не думаю об этом, но действительно была одна строка, где на этой неделе поле было нулевым. Скорее всего, именно это и отбросило все остальные попытки. Спасибо!