Синтаксис MS Access Date() в запросе к SQL Server

Я нашел несколько сообщений об использовании функции GETDATE() для связанной таблицы SQL Server во внешней процедуре VBA Access. Эти сообщения сосредоточены на предложении WHERE запроса, но мне не удалось найти соответствующую информацию об использовании GETDATE() для назначения столбцов.

Например, я понимаю, что в предложении WHERE я бы использовал что-то вроде этого:

WHERE MyDate = CAST(GETDATE() AS DATE)

Однако я получаю синтаксические ошибки в VBA, когда пытаюсь назначить текущую дату столбцу, например:

INSERT INTO MyTable ( SomeValue, TheDate ) SELECT 'Widget' AS Expr1, CAST(GETDATE() AS DATE) AS Expr2;

В этом примере TheDate определяется как DateTime в SQL Server. Написанный таким образом, VBA сообщает о синтаксической ошибке (отсутствует оператор) в выражении запроса «CAST (GETDATE () AS DATE)». Я попытался окружить выражение удобными для доступа # разделителями дат, но безуспешно.

Потратив около 30 минут на поиск stackexchange.com различными способами для MS Access Date() в SQL, я не смог найти это. Однако это так просто, я уверен, что на него уже ответили где-то.


person MarkF    schedule 22.09.2020    source источник
comment
В MS Access вы, вероятно (не на 100% уверены для связанного SQL, но вы можете попробовать) можете использовать функции Now() и Date(). Первый эквивалентен getdate() в SQL, второй возвращает текущую дату без времени - именно то, что вам нужно.   -  person Arvo    schedule 22.09.2020
comment
Да! Это работает в моем случае. Спасибо. Я думаю, что это разница в типах столбцов. Date() работает для столбца Date, а Now() работает для столбца DateTime. Когда я импортирую таблицу Access в SQL Server, процесс по умолчанию создаст столбец назначения как DateTime. Отправьте это как ответ, и я отмечу это как решение.   -  person MarkF    schedule 22.09.2020
comment
Это неправда. Единственная разница между Date() и Now() заключается в том, что Now() включает время суток. А теперь вы упомянули импорт, но ваш вопрос не об этом.   -  person Gustav    schedule 23.09.2020
comment
Я упоминаю об импорте только для того, чтобы заявить, что я не выбираю тип столбца назначения, он выбирается за меня. Я вижу, что Now() возвращает и дату, и время, и это работает лучше, чем Date() для столбца назначения типа DateTime.   -  person MarkF    schedule 23.09.2020


Ответы (3)


В MS Access вы, вероятно (не уверены на 100% для связанного SQL, вам нужно поэкспериментировать) должны использовать функции Now() и Date(). Первый эквивалентен getdate() в SQL, второй возвращает текущую дату без времени.

person Arvo    schedule 23.09.2020
comment
Это решило проблему для меня, изменив функцию Date() в моем операторе T-SQL вместо Now(). Я изменил это, и теперь код VBA работает так, как предполагалось. Я считаю, что это связано с тем, что столбец назначения имеет тип DateTime, и поэтому функция Date() не работает, поскольку исключает компонент времени. К сожалению, MS Access пометил это как синтаксическую ошибку, тогда как на самом деле это ошибка несоответствия типа данных. Часть (отсутствующий оператор) действительно отправила меня в неправильном направлении. - person MarkF; 23.09.2020

Если вы запустите это в Access для связанной таблицы (не PT-запроса), это должно выглядеть так:

INSERT INTO MyTable ( SomeValue, TheDate ) 
VALUES ('Widget', Date());
person Gustav    schedule 22.09.2020
comment
К сожалению, это не удается, когда я пытаюсь использовать MS Access. Мне удалось заставить его работать, когда я изменил тип столбца с DateTime на Date, но это не тот результат, который мне нужен. - person MarkF; 22.09.2020
comment
Вы, должно быть, путаете вещи. DateTime (не DateTime2) по определению является типом данных, используемым для даты и времени, которые должны считываться и записываться из Access. - person Gustav; 23.09.2020

Кажется, здесь есть некоторая путаница. Если вы создаете запрос Access, то значение имеет значение ZERO ZERO функций даты и синтаксиса SQL-сервера. Ваш SQL ДОЛЖЕН продолжать записываться в соответствии со стандартами Access, если только вы не используете сквозной запрос.

Тем не менее, я видел это 100 раз здесь. Какой тип данных на стороне сервера sql? Это дата-время или дата-время2?

И двойная, тройная, четырехкратная (и многое другое) проверка связанной таблицы в режиме проектирования.

Если вы связываетесь с SQL-сервером с помощью стандартного устаревшего драйвера SQL Server. Тот, что отгружался 20 лет с Windows 98SE?

Вы ДОЛЖНЫ проверить, видит ли Access эти столбцы как текст или как столбцы даты (которые в Access всегда разрешают часть времени, если хотите).

Код доступа, запросы, формы и ВСЕ должны требовать НУЛЕВЫХ изменений, если вы переносите эти данные из Access на сервер SQL и связываете таблицу. Еще раз: НОЛЬ НОЛЬ изменений.

Однако, если вы использовали datetime2 на стороне SQL-сервера? Тогда вы НЕ МОЖЕТЕ использовать устаревший драйвер SQL-сервера при связывании таблицы. Причина в том, что они не поддерживают новый формат datetime2. В результате Access будет фактически видеть, использовать и обрабатывать этот столбец как текстовый столбец. Вы ДЕЙСТВИТЕЛЬНО, но ДЕЙСТВИТЕЛЬНО не хотите, чтобы это произошло. Почему? Потому что затем вы проводите следующую неделю, задавая вопросы по SO о том, как не работает какой-либо код даты, столбец или запрос. еще раз: ZERO ZERO изменений в Access не требуется. Если ваши даты начинают ломаться, то проблема не в форматах дат, а в том, что этот столбец теперь рассматривается доступом как тип данных TEXT.

Soltuion: Либо измените столбцы datetime2 на стороне sql на datetime и повторно свяжите.

или повторно свяжите свои таблицы, используя более новый собственный 11 (или более позднюю версию - до 18 сейчас). таким образом, доступ будет видеть/использовать/обрабатывать datetime2 как правильный формат даты в Access.

Итак, прежде чем что-то делать? Откройте одну из таблиц Access, связанных с SQL-сервером, в режиме конструктора. (игнорируйте приглашение только для чтения). Теперь посмотрите на тип данных, присвоенный столбцам даты. Если они текстовые, то у вас царский беспорядок.

Вам необходимо повторно связать, используя более новые драйверы ODBC.

Нулевой из вашего существующего кода, sql и quires должен быть затронут или даже изменен, если вы используете связанную таблицу с сервером sql. Но опять же, если вы связались с использованием неправильного драйвера SQL ODBC, тогда Access не сможет ни увидеть, ни обработать эти столбцы datetime2 как дату - он будет использовать текст, и вы действительно не хотите, чтобы это произошло.

В итоге: любой код даты, обновления SQL, сортировка, запрос, код VBA, код формы, отчеты должны продолжать работать с НУЛЕВЫМИ изменениями. Если вы вносите изменения в даты после миграции, значит, вы сделали все это неправильно, и эти столбцы дат не видны при доступе как столбцы дат.

Либо избавьтесь от всех столбцов datetime2, а затем повторно свяжите (измените их на стороне сервера на datetime). Или повторно свяжите таблицы с помощью собственного драйвера ODBC версии 11 или более поздней. Любой из этих вариантов решит эту проблему.

Это исправление требует НУЛЕВОГО кода и нулевых изменений в Access, связанных с датами.

person Albert D. Kallal    schedule 26.09.2020