Date sql access
Date sql access
как правильно задавать Дату и ДатуВремя в SQL запросах в Access? К БД подключаюсь при помощи ADO.. Не понятно мне вот что: При добавлении новой записи в таблицу, я делаю так:
Дата:
INSERT INTO table (t_date)
VALUE («27.10.2008»)
ДатаВремя:
INSERT INTO table (t_datetime)
VALUE («27.10.2008 21:30:00»)
Вобщем формат Даты и ДатыВремени такой.. И все работает..
А вот если нужно сравнить дату, например:
SELECT *
FROM table
WHERE table.t_datetime = «27.10.2008 21:30:00»
то уже возникает ошибка..
← →
Stas © ( 2008-05-27 15:45 ) [1]
#27.10.2008 21:30:00# помоему так.
← →
MsGuns © ( 2008-05-27 15:55 ) [2]
Использовать параметрические запросы
← →
Anatoly Podgoretsky © ( 2008-05-27 15:58 ) [3]
> MsGuns (27.05.2008 15:55:02) [2]
Бесполезно сравнивать числа с плавающей запятой на абсолютную точность.
← →
MsGuns © ( 2008-05-27 16:07 ) [4]
>Anatoly Podgoretsky © (27.05.08 15:58) [3]
>Бесполезно сравнивать числа с плавающей запятой на абсолютную точность.
А причем здесь «числа с плавающей запятой» ?
← →
Dmitry_177 ( 2008-05-27 16:19 ) [5]
только не понятно еще, где-то накопал в интернете что нужно так: месяц/день/год хотя работает как я написал.. непонятно что-то..
← →
Anatoly Podgoretsky © ( 2008-05-27 16:23 ) [6]
> MsGuns (27.05.2008 16:07:04) [4]
А в Акцесс хранится именно в этом формате, совпадает с TDateTime
← →
MsGuns © ( 2008-05-27 16:40 ) [7]
>Dmitry_177 (27.05.08 16:19) [5]
>где-то накопал в интернете что нужно так: месяц/день/год хотя работает как я написал.. непонятно что-то..
← →
palva © ( 2008-05-27 16:48 ) [8]
По правилам нужно так #месяц/день/год#
Если Access обнаруживает, что дата невалидная он пробует поменять местами месяц и день.
← →
Anatoly Podgoretsky © ( 2008-05-27 16:52 ) [9]
> palva (27.05.2008 16:48:08) [8]
Когда меняет не страшно, страшно когда не меняет и ничего не говорит.
← →
Dmitry_177 ( 2008-05-27 17:05 ) [10]
хм.. тут наверно может быть тогда ошибка..(((
вот к примеру наша дата 27.10.2008.. 27-го меся не бывает, поэтому меняет местами и все ок.. а будет такая 12.10.2008 дата? Access запишет ее как 12 октября или 10 декабря?
← →
palva © ( 2008-05-27 18:27 ) [11]
> Access запишет ее как 12 октября или 10 декабря?
Вы хотите, чтобы мы для вас попробовали?
← →
Anatoly Podgoretsky © ( 2008-05-27 21:44 ) [12]
Пусть сначала моральный ущерб оплатит.
← →
Правильный_Вася ( 2008-05-27 22:21 ) [13]
использовать параметры в запросах
тогда никаких многозначностей не будет
← →
Dmitry_177 ( 2008-05-28 11:14 ) [14]
Еще вопрос.. А как сравнить ДатаВремя с Датой?
ДатаВремя — 27.10.2008 21:30:00
и Дата — 27.10.2008
вот нужно сравнить только дату, попробовал сделать так:
SELECT * FROM table
WHERE t_datetime = #27/10/2008#
не сравнивается.. помогите
← →
Правильный_Вася ( 2008-05-28 11:32 ) [15]
← →
Dmitry_177 ( 2008-05-28 11:39 ) [16]
SELECT * FROM table
WHERE t_datetime BETWEEN (#27/10/2008 00:00:00#, #27/10/2008 23:59:59#)
← →
Dmitry_177 ( 2008-05-28 11:40 ) [17]
т.е. так:
SELECT * FROM table
WHERE t_datetime BETWEEN #27/10/2008 00:00:00# AND #27/10/2008 23:59:59#
← →
DiamondShark © ( 2008-05-28 14:19 ) [18]
> т.е. так:
> SELECT * FROM table
> WHERE t_datetime BETWEEN #27/10/2008 00:00:00# AND #27/10/2008
> 23:59:59#
Лучше так:
WHERE t_datetime >= #27/10/2008 00:00:00# AND t_datetime
← →
Dmitry_177 ( 2008-05-28 23:59 ) [19]
А при добавлении записи:
INSERT INTO table (t_datetime)
VALUE («27.10.2008 21:30:00»)
правильней будет тоже месяц/день/год ?
← →
Palladin © ( 2008-05-29 07:58 ) [20]
правильней (относительно) будет
q.SQL.Text:=»insert into table (t_datetime) values (:PDateTime)»;
q.Parameters.ParamByName(«PDateTime»).Value:=Date;
q.ExecSQL;
ну или то, что предложит sniknik :), но с тем же подходом с параметром.
← →
Anatoly Podgoretsky © ( 2008-05-29 16:50 ) [21]
> Dmitry_177 (28.05.2008 11:40:17) [17]
Это не дает гарантии, что в условие попадут все записи за 27,10,2008 более того в текстовом виде вообще возможны разные сюрпризы.
Что делают в SQL текущая дата и другие функции даты и времени
Функция текущей даты SQL CURDATE() и её аналоги CURRENT_DATE() и CURRENT_DATE среди других функций даты и времени применяются наиболее часто из-за широких возможностей, обеспечиваемых ими для анализа данных. Знакомство с функциями даты и времени начнём с разбора практических примеров, демонстрирующих возможности функции текущей даты. А затем перейдём к остальным функциям даты и времени, соблюдая для удобства их классификацию по назначению.
Функция текущей даты SQL, её возможности
Функция текущей даты CURDATE() возвращает значение текущей даты в формате ‘YYYY-MM-DD’ и ‘YYYYDDMM’. Вычисляя несколькими способами (их как раз и разберём в этом параграфе) разницу значений дат, можно определить такие важные значения, как возраст человека, его трудовой стаж, продолжительность различных процессов и явлений и многое другое.
В примерах работаем с базой данных «Театр». Таблица Play содержит данные о постановках. Таблица Team — о ролях актёров. Таблица Actor — об актёрах. Таблица Director — о режиссёрах. Поля таблиц, первичные и внешние ключи можно увидеть на рисунке ниже (для увеличения нажать левой кнопкой мыши).
Это уже база с большим объёмом данных по сравнению с примерами ко многим другим темам нашего курса. Поэтому не будем приводить строки данных таблиц и таблицы результатов запросов. Однако это будет компенсировано подробным разбором логики построения запросов, которые, надо признать, имеют достаточно высокую сложность.
Пример 1. Сформировать список актеров старше 70 лет. Пишем следующий запрос:
В этом запросе вычисляется разница между текущей датой CURDATE() и датой рождения актёра BirthDate, содержащейся в таблице ACTOR. Для вычисления разницы применена функция TIMESTAMPDIFF(). Ключевое слово YEAR — задаёт единицу измерения — в годах интервала между датами. Вычисленное значение и результат его сравнения с числом 70 вполне пригодны в качестве условия выборки в секции WHERE. Следует учесть, что функция TIMESTAMPDIFF() существует лишь в MySQL. В других диалектах SQL для этого есть функция DATEDIFF, а для задания единицы измерения применяются различные ключевые слова в различных вариантах написания.
Для вычисления разницы дат можно использовать и оператор «минус». Это сделано в следующем примере.
Пример 2. Вывести список актеров, которые не задействованы в новых постановках (в постановках последних 3 лет). Использовать CURDATE(), NOT IN. Запрос будет следующим:
В этом запросе задействована функция YEAR(). Аргументами её являются дата премьеры постановки premieredate из таблицы play и текущая дата. Для вычисления разницы использован оператор «минус». Он имеет больший приоритет по сравнению с оператором сравнения и поэтому выполняется первым. Вычисленнное выражение сравнивается с числом 3 и подходящие значения служат условием выборки из таблицы play, содержащей данные о постановках. Этот подзапрос — самый глубокий в «матрёшке» целого запроса. Подзапрос более высокого уровня из таблицы team, содержащей данные о ролях, выбирает идентификаторы актёров, с помощью предиката IN. Выбираются те актёры, которые участвовали в постановках трёх послежних лет. И, наконец, самый внешний запрос к таблице actor выбирает значения с отрицанием (NOT IN) значения предыдущего подзапроса.
Далее — пример использования соединения таблиц, среди которых из одной выбирается дата для вычисления разницы с текущей датой.
Пример 3. Сформировать список актеров с их стажем (в днях). Использовать CURDATE(), GROUP BY. Запрос будет следующим:
В этом запросе разница между текущей датой CURDATE() и датой премьеры постановки PremiereDate из таблицы Play вычисляется как имя столбца в результирующей таблице. Поскольку эти даты имеют один и тот же формат, для вычисления разницы достаточно использовать оператор «минус». Разница вычислена. Но из таблицы Play невозможно напрямую «достучаться» до таблицы Actor, содержащей данные об актёрах. Поэтому используем соединение (JOIN) этой таблицы с таблицей Team, которая уже связана с таблицей Actor при помощи ключа Actor_ID. Соединение таблиц Team и Actor — второе в этой цепочке из трёх таблиц.
Составить SQL запросы с текущей датой самостоятельно, а затем посмотреть решения
Пример 4. Определить самого востребованного актера за последние 5 лет. Оператор JOIN использовать 2 раза. Использовать CURDATE(), LIMIT 1.
Пример 5. Определить спектакли, в которых средний возраст актеров от 20 до 30 (использовать BETWEEN, GROUP BY, AVG).
Функции, возвращающие текущие дату, время, дату и время
CURDATE(), CURRENT_DATE(), CURRENT_DATE — возвращают текущую дату в формате ‘YYYY-MM-DD’ или YYYYDDMM в зависимости от того, вызывается функция в текстовом или числовом контексте.
CURTIME(), CURRENT_TIME(), CURRENT_TIME — возвращают текущее время суток в формате ‘hh-mm-ss’ или hhmmss в зависимости от того, вызывается функция в текстовом или числовом контексте.
NOW() — возвращает текущие дату и время формате ‘YYYY-MM-DD hh:mm:ss’ или YYYYDDMMhhmmss в зависимости от того, вызывается функция в текстовом или числовом контексте.
Функции для вычисления разницы между моментами
TIMEDIFF(param1, param2) — возвращает разницу между значениями времени, заданными параметрами param1 и param2.
DATEDIFF(param1, param2) — возвращает разницу между датами param1 и param2. Значения param1 и param2 могут иметь типы DATE или DATETIME, а при вычислении разницы используется лишь часть DATE.
PERIOD_DIFF(param1, param2) — возвращает разницу в месяцах между датами param1 и param2. Значения param1 и param2 могут быть представлены в числовом формате YYYYMM или YYMM.
TIMESTAMPDIFF(interval, param1, param2) — возвращает разницу между значениями датами param1 и param2. Значения param1 и param2 могут быть представлены в форматах ‘YYYY-MM-DD’ или ‘YYYY-MM-DD hh:mm:ss’. Единица измерения разницы задаётся параметром interval. Он может принимать значения FRAC_SECOND (микросекунды), SECOND (секунды), MINUTE (минуты), HOUR (часы), DAY (дни), WEEK (недели), MONTH (месяцы), QUARTER (кварталы), YEAR (годы).
Функции для добавления (или вычитания) некоторого значения к моменту
ADDDATE(date, INTERVAL value) — возвращает дату, к которой прибавлено значение value. Ключевое слово INTERVAL обязательно следует в запросе, после него указывается значение value, а затем единицы измерения прибавляемого значения. Ими могут быть SECOND (секунды), MINUTE (минуты), HOUR (часы), MINUTE_SECOND (минуты и секунды), HOUR_MINUTE (часы и минуты), DAY_SECOND (дни, часы минуты и секунды), DAY_MINUTE (дни, часы и минуты), DAY_HOUR (дни и часы), YEAR_MONTH (годы и месяцы).
SUBDATE(date, INTERVAL value) — вычитает из величины даты date произвольный временной интервал и возвращает результат. Ключевое слово INTERVAL обязательно следует в запросе, после него указывается значение value, а затем единицы измерения вычитаемого значения. Возможные единицы измерения — те же, что и для функции ADDDATE().
SUBTIME(datetime, time) — вычитает из величины времени datetime вида ‘YYYY-MM-DD hh:mm:ss’ произвольно заданное значение времени time и возвращает результат.
PERIOD_ADD(period, N) — добавляет N месяцев к значению даты period. Значение period должно быть представлено в числовом формате ‘YYYYMM’ или ‘YYMM’.
TIMESTAMPADD(interval, param1, param2) — прибавляет к дате и времени суток param2 в полном или кратком формате временной интервал param1, единицы измерения которого заданы параметром interval. Возможные единицы измерения — те же, что и для функции TIMESTAMPDIFF().
Функции, характеризующие момент (значение аргумента)
DATE(datetime) — извлекает из значения даты и времени суток в формате DATETIME (‘YYYY-MM-DD hh:mm:ss’) только дату, отсекая часы, минуты и секунды.
TIME(datetime) — извлекает из значения даты и времени суток в формате DATETIME (‘YYYY-MM-DD hh:mm:ss’) только время суток, отсекая дату.
TIMESTAMP(param) — принимает в качестве аргумента дату и время суток в полном или кратком формате и возвращает полный вариант в формате DATETIME (‘YYYY-MM-DD hh:mm:ss’).
DAY(date), DAYOFMONTH(date) — принимают в качестве аргумента дату, и возвращают порядковый номер дня в месяце (от 1 до 31).
DAYNAME(date) — принимает в качестве аргумента дату, и возвращает день недели в виде полного слова на английском языке.
DAYOFWEEK(date) — принимает в качестве аргумента дату, и возвращает порядкоый номер дня недели от 1 (воскресенье) до 7 (суббота).
WEEKDAY(date) — принимает в качестве аргумента дату, и возвращает порядкоый номер дня недели от 0 (понедельник) до 6 (воскресенье).
WEEK(date) — принимает в качестве аргумента дату, и возвращает номер недели в году для этой даты от 0 до 53.
WEEKOFYEAR(datetime) — возвращает порядковый номер недели в году для даты datetime от 1 до 53.
MONTH(datetime) — возвращает числовое значение месяца года от 1 до 12 для даты datetime.
MONTHNAME(datetime) — возвращает строку с названием месяца для даты datetime.
QUARTER(datetime) — возвращает значение квартала от 1 до 4 для даты datetime, которая может быть передана в формате ‘YYYY-MM-DD’ или ‘YYYY-MM-DD hh:mm:ss’.
YEAR(datetime) — возвращает год от 1000 до 9999 для даты datetime.
DAYOFYEAR(date) — возвращает порядковый номер дня в году от 1 до 366 для даты date.
HOUR(datetime) — возвращает значение часа от 0 до 23 для времени datetime.
MINUTE(datetime) — возвращает значение минут от 0 до 59 для времени datetime.
SECOND(time) — возвращает количество секунд для времени суток time, которое задаётся либо в виде строки ‘hh:mm:ss’, либо числа hhmmss.
EXTRACT(type FROM datetime) — принимает дату и время суток datetime и возвращает часть, определяемую параметром type. Значениями параметра могут быть YEAR, MONTH, DAY, HOUR, MINUTE, SECOND.
Функции для преобразования разницы в дни и секунды
TO_DAYS(date) — принимает дату date в кратком ‘YYYY-MM-DD’ или полном формате ‘YYYY-MM-DD hh:mm:ss’ и возвращает количество дней, прошедших с нулевого года.
FROM_DAYS(N) — принимает количество дней N, прошедших с нулевого года, и возвращает дату в формате ‘YYYY-MM-DD’.
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(datetime) — если параметр не указан, то возвращает количество секунд, прошедших с 00:00 1 января 1970 года. Если параметр datetime указан (в кратком ‘YYYY-MM-DD’ или полном формате ‘YYYY-MM-DD hh:mm:ss’), то возвращает разницу в секундах между 00:00 1 января 1970 года и датой datetime.
FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp, format) — принимает количество секунд, прошедших с 00:00 1 января 1970 года и возвращает дату и время суток в виде строки ‘YYYY-MM-DD hh:mm:ss’ или в виде числа YYYYDDMMhhmmss в зависимости от того, вызвана функция в строковом или числовом контексте.
TIME_TO_SEC(time) — принимает время суток time в формате ‘hh:mm:ss’ и возвращает количество секунд, прошедших с начала суток.
SEC_TO_TIME(seconds) — принимает количество секунд seconds, прошедших с начала суток и возвращает время в формате ‘hh:mm:ss’ или hhmmss в зависимости от того, вызвана функция в строковом или числовом контексте.
MAKEDATE(year, dayofyear) — принимает год year, номер дня в году dayofyear и возвращает дату в формате ‘YYYY-MM-DD’.
MAKETIME(hour, minute, second) — принимает часы hour, минуты minute и секунды second и возвращает время суток в формате ‘hh:mm:ss’.
MS Access Date() функция и SQL запрос сервера
Я не могу, кажется, найти прямой ответ на то, что кажется обычным сценарием. Недавно я преобразовал базу данных access в сервер SQL и связал таблицы (odbc). Поскольку даты теперь хранятся в datetime2 как yyyy-mm-dd hh:mm:ss, у меня не было никаких проблем в VBA, чтобы мои формы записывались в базу данных, как Format(VBA.Date, «yyyy-mm-dd 00:00:00») .
Однако у меня есть несколько простых запросов в Access, которые имели предложение where, например:
Как правильно запросить их из запроса доступа к серверу SQL?
1 Ответ
код доступа
Sql сервер
Функция GETDATE() получает текущий Datetime.
Дата между сегодня и вчера 7 дней
Причина, по которой я использовал функцию CAST() , заключается в том, что GETDATE() возвращает текущий Datetime примерно так 2014-02-09 22:09:53.067
теперь, если вы проверяете значения, где поле имеет сегодняшнюю дату, это будет только значения where Field = ‘2014-02-09 22:09:53.067’ , а не записи, где дата 2014-02-09 , это также будет учитывать время, потому что я использовал функцию приведения, чтобы избавиться от части времени из функции GETDATE().
Я исправил проблемы с вашим запросом их было довольно много: S Я бы предложил почитать книги онлайн и узнать правильный synatx для сервера sql, смотрите ниже исправленный запрос
Похожие вопросы:
Я пытаюсь преобразовать MS Access Cross Tab query в хранимую процедуру сервера SQL, но у меня проблема с поворотом данных на сервере SQL. Вот перекрестный запрос MS Access, который я хочу.
Я хотел бы знать, можно ли объединить результаты двух разных баз данных, MS Access и SQL Server. Вот что я пытаюсь сделать: Выберите EVERYTHNIG между двумя датами из таблицы SQL Server 2008 R2.
Я искал, но так и не смог этого выяснить. Я использовал MS Access много лет назад, но в основном переключился на PHP и MySQL, чтобы делать свою работу. Но когда я на работе, я должен использовать.
Я использую MS Access в качестве переднего плана для моего сервера MS SQL. Когда я использую запрос SQL в ms Access, который (на мой взгляд) эквивалентен запросу, который я запускаю с сервера SQL.
Я пытаюсь создать запрос MS Access, чтобы дать мне количество записей по месяцам за текущий год. Поле с датой является текстовым, а дата имеет формат YYYY-MM . Все, что я читал, говорит об.
Я пытаюсь запустить хранимую процедуру сервера SQL с помощью кнопки в форме MS Access. Связанный сервер уже создан, но я немного смущен запуском хранимой процедуры из Access. Процедура обновит.
Я очень новичок в доступе и нуждаюсь в небольшой помощи здесь. Я работал на MS Access 2007 (в VB) с SQL 2008 Server в качестве моей базы данных. Я хотел показать таблицу SQL в интерфейсе Access, но.
Я работаю над заменой старой системы ms access на сервер SQL с интерфейсом C#. К сожалению, у меня есть некоторые пользователи die hard ms access, которые будут получать доступ к таблицам сервера.
Я нашел запрос MS Access select и в предложении where я нашел некоторые проблемы для понимания Я хочу преобразовать в запрос сервера SQL, пожалуйста, помогите. (((TABLE1.COL1) > #12/31/2011#) AND.
Вот та часть кода,которая была использована в запросе MS Access. Что я должен использовать вместо этого для запроса сервера SQL? Формат даты такой же, как GETDATE() .
Как из даты получить год, месяц или день в T-SQL? Microsoft SQL Server
Привет, сегодня я покажу, как в T-SQL из даты можно получить определенную часть этой даты, например, год, месяц, день и даже час, иными словами, в данном материале мы ответим на несколько вопросов, которые связаны с извлечением данных из значения, содержащего дату.
Как в T-SQL получить текущую дату?
Для начала давайте я расскажу о том, как в Microsoft SQL Server можно получить значение текущей даты.
Для получения текущей даты в Microsoft SQL Server существует несколько специальных системных функций. Давайте некоторые из этих функций рассмотрим.
- GETDATE – функция возвращает значение, которое содержит дату и время компьютера, на котором запущен экземпляр Microsoft SQL Server, при этом смещение часового пояса не включается. Лично мне достаточно часто приходится пользоваться именно этой функцией;
- CURRENT_TIMESTAMP – эта функция эквивалентна функции GETDATE, она возвращает точно такое же значение. Вы можете использовать любую функцию, но как я уже сказал, лично я отдаю предпочтение функции GETDATE;
- SYSDATETIME – данная функция также возвращает дату и время компьютера, на котором запущен экземпляр Microsoft SQL Server, смещение часового пояса тоже не включается. Но в данном случае функция возвращает значение с более высокой точностью в долях секунды.
Примечание! Для того чтобы получить значение даты и времени с учетом смещения часового пояса, необходимо использовать функцию SYSDATETIMEOFFSET, а для того чтобы получить значение даты и времени в формате UTC функции GETUTCDATE или SYSUTCDATETIME.
Пример – получение текущей даты в Microsoft SQL Server
В данном примере мы вызовем три функции получения текущей даты.
Как видите, результат практически одинаковый, за исключением того, что SYSDATETIME вернула более точное значение времени.
Как получить год из даты в T-SQL?
Если у Вас возникла необходимость из даты получить год, то есть, например, из 01.01.2019 получить 2019 в виде отдельного значения или просто из текущей даты получить год, то в Microsoft SQL Server Вы это можете сделать несколькими способами.
Первый способ заключается в использовании специальной функции YEAR, которая как раз и делает ровно то, что нам нужно, иными словами, она возвращает целое число, представляющее год даты, указанной во входном параметре.
Второй способ предполагает использование другой функции T-SQL – это DATEPART, которая возвращает целое число, представляющее указанную часть даты.
DATEPART принимает два параметра: первый, datepart, т.е. какую часть даты нам нужно вернуть, второй, дата, которую необходимо обработать.
Пример – получаем год из даты в Microsoft SQL Server
В данном примере я покажу различные вариации передачи параметра DATE в указанные выше функции, так как его можно передать и в виде переменной, и в виде выражения, и в виде функции. Сразу скажу, что эти способы передачи параметра можно использовать и в других функциях, которые сегодня мы будем рассматривать.
Чтобы DATEPART нам вернула год из даты, первым параметром нам необходимо передать значение, характеризующее часть «год», допустимо передавать следующие значения: year, yyyy или yy.
Как получить месяц из даты в T-SQL?
В T-SQL из даты можно получить и номер месяца, для этого можно использовать функцию MONTH, она возвращает целое число, представляющее месяц указанной даты или все ту же функцию DATEPART, в которую, в данном случае необходимо будет передать значение, характеризующее часть даты «месяц», можно использовать: month, mm или m.
Пример – получаем месяц из даты в Microsoft SQL Server
В этом примере мы получаем месяц из даты снова несколькими способами.
Как из даты получить день в T-SQL?
Для того чтобы получить из даты день, в T-SQL можно использовать функцию DAY – это функция возвращает целое число, представляющее день указанной даты. Также можно использовать и уже знакомую функцию DATEPART со значением первого параметра: day, dd или d.
Пример – получаем день из даты в Microsoft SQL Server
Здесь также мы используем несколько способов для получения дня из даты.
Как из даты получить час в T-SQL?
Чтобы из даты получить час, мы можем использовать функцию DATEPART со значением hour или hh. Только в данном случае второй параметр (date), в котором мы передаем значение даты, должен обязательно содержать время, т.е. иметь тип данных DATETIME, тип DATE не допускается.
Пример – получаем час из даты в Microsoft SQL Server
В этом примере мы из даты получаем час.
У меня все, надеюсь, перечисленные выше примеры помогут Вам в решении Ваших задач. Начинающим программистам рекомендую пройти наши онлайн-курсы по T-SQL, на которых Вы «с нуля» научитесь работать с SQL и программировать на T-SQL в Microsoft SQL Server.
MS Access: формат даты для SQL-вставки с использованием VBA
Это может быть очень простой вопрос, но мне трудно понять информацию, которую я нашел в Интернете до сих пор. Когда я пытаюсь запустить SQl из моего VBA, это дает мне несоответствие типа на моей strSQl.
У меня есть таблица [tbl_DatabaseUpdateLog] с 4 столбцами
Я должен регулярно извлекать информацию из баз данных компании для меньшего проекта анализа, и я хочу регистрировать, как часто и сколько времени требуется для выполнения этих запросов. Каждый раз при запуске обновления выполняется следующее:
Я пробовал использовать # вокруг дат и использовать Now() вместо Time(), но я чувствую, что у меня отсутствует базовая концепция, которая поможет мне исправить эту проблему. Мне просто нужно Время дня и продолжительность (не столько сама дата), если это помогает.
Когда я пытаюсь запустить SQl из моего VBA, это дает мне несоответствие типа на моем strSQl
Изучите эти 2 заявления.
Когда вы объявляете strSQl As Date , это означает, что strSQl может удерживать только значения даты/времени. Строка, такая как «INSERT INTO. whatever» не является значением Date/Time. Поэтому, когда вы strSQl сохранить такую строку в strSQl , Access жалуется, что типы данных несовместимы: «Тип несоответствия».
Поскольку вы намерены strSQl хранить текст SQL-запроса, объявите его таким образом (вместо As Date ): Dim strSQl As String
Это изменение приведет вас к ошибке. Для вашей более широкой цели используйте запрос параметров с DAO.
Обратите внимание, что при таком подходе для INSERT формат даты даже не является проблемой. Поскольку StartUpdate , EndUpdate и LengthUpdate будут действительными значениями Дата/Время, вы можете просто передать их параметрам, не беспокоясь о формате и # разделителях.
Я вижу, что вы используете INSERT INTO SELECT FROM (literal) когда простой INSERT INTO (columns) VALUES (values) будет проще. Вы также можете иметь несколько VALUES в одном операторе INSERT , который является опрятным.
Я также вижу, что вы храните денормализованные данные, ясно, что Duration можно получить из End — Start , поэтому вы можете отказаться от этого столбца.
Кроме того, избегайте венгерской нотации, в этом случае префикс имени таблицы с помощью tbl_ . Это не 80-е годы. Не делай этого.
Ужасный короткий и простой ответ с использованием конкатенации строк:
(Никогда не делайте этого)
SQL Server
Если вы используете SQL Server, вам нужно заключать даты в одинарные кавычки, и вам необходимо преобразовать их в однозначную строку формата даты, например, yyyy-MM-dd HH:mm:ss .
Доступ /Jet
Если вы используете Access или Jet, вам нужно заключить даты в хэш-символы «#» и использовать формат «MM/dd/yyyy hh: mm: ss tt» (тупые американцы. ).
Лучший ответ: используйте параметры
(Делайте это вместо этого)
SQL Server
SQL Server использует именованные параметры, такие как @foo :
Доступ /Jet
Доступ использует анонимные заполнители, к которым обращается заказ, который они добавили, используйте ‘?’:
Метод Append в VBA является Sub поэтому его вызов не использует скобки.
CreateParameter метод имеет 3 необязательные аргументы в середине: Type , Direction и Size , которые могут быть выведены из значений, поэтому они опущены, положив ,, , .