Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Количество месяцев между двумя датами


Автор: ihtiandr 29.1.2012, 08:51
Народ всем доброго времени суток.
Помогите пожалуйста разобраться.
Надо написать запрос для вычисления количества месяцев между двумя датами
изменения по каждой записи сразу должны обовляться в таблице.
вот пробовал так :

Код

Form1->ADOQuery1->Close(); Form1->ADOQuery1->SQL->Clear();
Form1->ADOQuery1->SQL->Add("UPDATE  Obsh SET kolmes= DATEDIFF(month,'" + DateTimePicker2->DateTime + "','" + DateTimePicker1->DateTime + "',month)");
Form1->ADOQuery1->ExecSQL();
     

в результате выходит ошибка
"параметр month не имеет значений по умолчанию"

потом изменил на это:

Код

Form1->ADOQuery1->Close(); Form1->ADOQuery1->SQL->Clear();
Form1->ADOQuery1->SQL->Add("UPDATE  Obsh SET kolmes= MONTHS BETWEEN('" + DateTimePicker2->DateTime + "','" + DateTimePicker1->DateTime + "')");
Form1->ADOQuery1->ExecSQL();
     
выходит ошибка синтаксиса (запятая).

Автор: Данкинг 29.1.2012, 10:27
Код

Form1->ADOQuery1->SQL->Add("UPDATE  Obsh SET kolmes= DATEDIFF("m",'" + DateTimePicker2->DateTime + "','" + DateTimePicker1->DateTime");

Автор: ihtiandr 29.1.2012, 10:33
Данкинг
я использовал ваш запрос он не компилируется а сразу выдаёт ошибки
[C++ Error] Unit1.cpp(1241): E2121 Function call missing )
[C++ Error] Unit1.cpp(1241): E2380 Unterminated string or character constant

Автор: Данкинг 29.1.2012, 11:00
ihtiandr, ну расставь скобочки и кавычки как надо.

Автор: ihtiandr 29.1.2012, 11:09
Данкинг
Код

Form1->ADOQuery1->SQL->Add("UPDATE  Obsh SET kolmes= DATEDIFF( "m",'" + DateTimePicker2->DateTime + "','" + DateTimePicker1->DateTime + "')");

так вроде все ковычки правильно стоят  smile 
я и так пробовал написать
 
Код


Form1->ADOQuery1->SQL->Add("UPDATE  Obsh SET kolmes= DATEDIFF( '" m "','" + DateTimePicker2->DateTime + "','" + DateTimePicker1->DateTime + "')");


таже ошибка

Автор: ihtiandr 29.1.2012, 11:29
Данкинг
Код

Form1->ADOQuery1->SQL->Add("UPDATE  Obsh SET kolmes= DATEDIFF((m),'" + DateTimePicker2->DateTime + "','" + DateTimePicker1->DateTime + "')");


вот так запустился но во время исполнения опять выходит ошибка

"параметр m не имеет значений по умолчанию"

Автор: Данкинг 29.1.2012, 12:04
"UPDATE  Obsh SET kolmes= DATEDIFF("+char(34)+"m"+char(34)+","+ DateTimePicker2->DateTime + "," + DateTimePicker1->DateTime + ")";

Автор: ihtiandr 29.1.2012, 12:11
Данкинг
Цитата

"UPDATE  Obsh SET kolmes= DATEDIFF("+char(34)+"m"+char(34)+","+ DateTimePicker2->DateTime + "," + DateTimePicker1->DateTime + ")";


не компилируется

[C++ Error] Unit1.cpp(1241): E2085 Invalid pointer addition

Автор: Данкинг 29.1.2012, 12:45
Вообще пиши лучше на Дельфи - там таких проблем не было и нет. smile 

Код

 String kav=char(34);
...
"UPDATE  Obsh SET kolmes= DATEDIFF("+kav+"m"+kav+","+ DateTimePicker2->DateTime + "," + DateTimePicker1->DateTime + ")";


Автор: ihtiandr 29.1.2012, 13:07
 Данкинг

Код

String kav=char(34);
...
"UPDATE  Obsh SET kolmes= DATEDIFF("+kav+"m"+kav+","+ DateTimePicker2->DateTime + "," + DateTimePicker1->DateTime + ")";


запустилось только при выполнении
"Неправильно определён объект Parameter. Предоставлены не совместимые или не полные сведения."

Цитата

Вообще пиши лучше на Дельфи - там таких проблем не было и нет.
  
я просто уже всё на с++ написал а вот с этим запросом проблемы появились   smile 

Автор: Данкинг 29.1.2012, 13:23
Так это уже ошибка СУБД, по всей вероятности.

Автор: ihtiandr 29.1.2012, 19:01
Данкинг
так DATEDIFF должен возвращать интовые значения а поле kolmes у меня как раз целочисленное
а СУБД у меня Access

Автор: Данкинг 29.1.2012, 19:27
Цитата(ihtiandr @  29.1.2012,  20:01 Найти цитируемый пост)
так DATEDIFF должен возвращать интовые значения а поле kolmes у меня как раз целочисленное

А в чём разница между Integer и целочисленным? smile 
Цитата(ihtiandr @  29.1.2012,  20:01 Найти цитируемый пост)
а СУБД у меня Access 

Вот и посмотри, в каком виде там должна быть представлена дата. И вообще для простоты лучше сделать запрос с параметрами, а не как сейчас.

Автор: ihtiandr 29.1.2012, 20:00
Данкинг

Цитата


Вот и посмотри, в каком виде там должна быть представлена дата. И вообще для простоты лучше сделать запрос с параметрами, а не как сейчас.


Но зачем здесь запрос с параметрами и как его использвать если он только для выбора записей например как 
Between #01.01.98# And #31.12.98#
или
LIKE "*" & [Введите продукты, содержащие выражение] & "*"

Автор: Данкинг 29.1.2012, 20:26
Цитата(ihtiandr @  29.1.2012,  21:00 Найти цитируемый пост)
Но зачем здесь запрос с параметрами

Чтобы не громоздить строку из переменных и кавычек.
Цитата(ihtiandr @  29.1.2012,  21:00 Найти цитируемый пост)
и как его использвать если он только для выбора записей например как 

Как обычно использовать. При чём здесь выбор записей?
Цитата(ihtiandr @  29.1.2012,  21:00 Найти цитируемый пост)
#01.01.98#

Вот-вот, как-то так должна выглядеть дата в Access'е. А из DateTimePicker дата к тому же ещё и со временем возвращается.

Автор: ihtiandr 29.1.2012, 20:51
Данкинг

спасибо  smile  вы оказались правы я изменил  DateTimePicker2->DateTime на поля где у меня хранятся даты и запрос заработал  smile  smile 

Автор: Данкинг 29.1.2012, 21:36
Как изменил, не понял? Ну, если работает, то хорошо. smile 

Автор: ihtiandr 30.1.2012, 16:14
Данкинг
я вместо  DateTimePicker2->DateTime  в запросе поставил поля где у меня хранятся даты
SKakOpl,PoKakOpl
они у меня в базе типа дат с маской #00.00.00#

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)