Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 23.06.2010, 03:08   #1
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
Печаль Запись даты в FireBird

В базе FB в таблице имеется поле с типом DATE туда необходимо записать только год.
Пытаюсь сделать так
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
   pFIBQuery1.SQL.Clear;
   Form1.pFIBQuery1.SQL.Text:='INSERT INTO TS (ID,DAT) VALUES(:ID,:DAT)';
   Form1.pFIBQuery1.ParamByName('ID').Value:=10;
 Form1.pFIBQuery1.ParamByName('DAT').Value:=FormatDateTime('yyyy',datetimepicker1.Date);
   Form1.pFIBQuery1.ExecQuery;
   Form1.pFIBQuery1.Transaction.Commit;
end;
но пишет ошибку что данные не соответствуют формату ячейки.
если писать дату в таком формате 12.12.2112 то все норм как поменять полю формат даты? Работаю в IBExpert
Lokos вне форума
Старый 23.06.2010, 03:29   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А если сделать у поля с датой тип не DATE, а VARCHAR? Тогда можно было бы сделать так:
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
   pFIBQuery1.SQL.Clear;
   Form1.pFIBQuery1.SQL.Text:='INSERT INTO TS (ID,DAT) VALUES(:ID,:DAT)';
   Form1.pFIBQuery1.ParamByName('ID').Value:=10;
 Form1.pFIBQuery1.ParamByName('DAT').Value:=QuotedStr(DateToStr(datetimepicker1.Date));
   Form1.pFIBQuery1.ExecQuery;
   Form1.pFIBQuery1.Transaction.Commit;
end;
P.S. Почему у вас в поле ID вручную заносится значения? Какого оно типа? Сделайте его поле-счетчиком, а в запросе вставки в таком случае пишите так:
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
   pFIBQuery1.SQL.Clear;
   Form1.pFIBQuery1.SQL.Text:='INSERT INTO TS (ID,DAT) VALUES(null,:DAT)';
 Form1.pFIBQuery1.ParamByName('DAT').Value:=QuotedStr(DateToStr(datetimepicker1.Date));
   Form1.pFIBQuery1.ExecQuery;
   Form1.pFIBQuery1.Transaction.Commit;
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума
Старый 23.06.2010, 03:41   #3
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
А если сделать у поля с датой тип не DATE, а VARCHAR? Тогда можно было бы сделать так:
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
   pFIBQuery1.SQL.Clear;
   Form1.pFIBQuery1.SQL.Text:='INSERT INTO TS (ID,DAT) VALUES(:ID,:DAT)';
   Form1.pFIBQuery1.ParamByName('ID').Value:=10;
 Form1.pFIBQuery1.ParamByName('DAT').Value:=QuotedStr(DateToStr(datetimepicker1.Date));
   Form1.pFIBQuery1.ExecQuery;
   Form1.pFIBQuery1.Transaction.Commit;
end;
P.S. Почему у вас в поле ID вручную заносится значения? Какого оно типа? Сделайте его поле-счетчиком, а в запросе вставки в таком случае пишите так:
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
   pFIBQuery1.SQL.Clear;
   Form1.pFIBQuery1.SQL.Text:='INSERT INTO TS (ID,DAT) VALUES(null,:DAT)';
 Form1.pFIBQuery1.ParamByName('DAT').Value:=QuotedStr(DateToStr(datetimepicker1.Date));
   Form1.pFIBQuery1.ExecQuery;
   Form1.pFIBQuery1.Transaction.Commit;
end;
Поле ID заносятся в ручную потому что используется база для обучения лень писать тригер и генератор))) А вот по году, как потом можно будет вывести записи скажем у которых год больше 1998, разве с типом варчар можно будет работать как с числовым скажем указать > или <
Lokos вне форума
Старый 23.06.2010, 03:46   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
А вот по году, как потом можно будет вывести записи скажем у которых год больше 1998, разве с типом варчар можно будет работать как с числовым скажем указать > или <
Два варианта можно попробовать.
I вариант. А если так попробовать вставить в БД:
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
   pFIBQuery1.SQL.Clear;
   Form1.pFIBQuery1.SQL.Text:='INSERT INTO TS (ID,DAT) VALUES(:ID,:DAT)';
   Form1.pFIBQuery1.ParamByName('ID').Value:=10;
 Form1.pFIBQuery1.ParamByName('DAT').Value:=QuotedStr(DateToStr(FormatDateTime('yyyy',datetimepicker1.Date)));
   Form1.pFIBQuery1.ExecQuery;
   Form1.pFIBQuery1.Transaction.Commit;
end;
II вариант
Попробовать в выборке так написать:
Код:
 select * from table where DAT='+QuotedStr(FormatDateTime('yyyy',datetimepicker1.Date));
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума
Старый 23.06.2010, 04:05   #5
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Два варианта можно попробовать.
I вариант. А если так попробовать вставить в БД:
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
   pFIBQuery1.SQL.Clear;
   Form1.pFIBQuery1.SQL.Text:='INSERT INTO TS (ID,DAT) VALUES(:ID,:DAT)';
   Form1.pFIBQuery1.ParamByName('ID').Value:=10;
 Form1.pFIBQuery1.ParamByName('DAT').Value:=QuotedStr(DateToStr(FormatDateTime('yyyy',datetimepicker1.Date)));
   Form1.pFIBQuery1.ExecQuery;
   Form1.pFIBQuery1.Transaction.Commit;
end;
II вариант
Попробовать в выборке так написать:
Код:
 select * from table where DAT='+QuotedStr(FormatDateTime('yyyy',datetimepicker1.Date));
Ну так без сомнения он вставит запись, и выведет ее.
Но если мне нужно будет выбрать не определенный год а скажем вот с таким условием Dat>1998 and Dat<2009 как это можно будет сделать если даты хранятся в текстовом виде? Просто у меня изначально и был тип varchar но потом я подумал о такой возможности и задался вопросом что делать в таком случае
Lokos вне форума
Старый 23.06.2010, 04:12   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вы применяли мой код вставки из поста №4? В каком виде заносится дата в БД?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума
Старый 23.06.2010, 04:28   #7
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Вы применяли мой код вставки из поста №4? В каком виде заносится дата в БД?
не в каком ошибка

[DCC Error] Unit1.pas(127): E2250 There is no overloaded version of 'DateToStr' that can be called with these arguments
Lokos вне форума
Старый 23.06.2010, 04:38   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А если без QuotedStr?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума
Старый 23.06.2010, 04:57   #9
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
А если без QuotedStr?
тоже самое(((
Lokos вне форума
Старый 23.06.2010, 07:33   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Lokos, Ваша проблема в том, что Вы хотите совместить несовместимое.
Значит так. Или Вы делаете поле DAT типа Integer и пишете туда свой год, или,
если уж Вы используете поле DateTime - то и пишите туда ДАТУ!!
Вас не интересуют день и месяц?! Ну так и не обращайте на них внимание! (обычно, конечно, туда принято писать определённое число, например 1.01.ВашГод - но, строго говоря, это неважно.
Писать надо так:
Код:
Form1.pFIBQuery1.ParamByName('DAT').Value:=datetimepicker1.Date;
выборку надо делать так:
Код:
select ID, year(DAT) from ...
а условие выборки, соответственно:
Код:
select ... from ... 
where  year(Dat)>1998 and year(Dat)<2009 
или (лучше):
where  year(Dat) BETWEEN 1998 and 2009
Serge_Bliznykov вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Count. Firebird artemavd БД в Delphi 21 12.09.2010 12:00
Автоматизация заполнения даты и зависимость ячейки времени к ячейке даты. Каравай Microsoft Office Excel 14 11.03.2010 18:11
Проверка даты. Firebird artemavd БД в Delphi 10 18.10.2009 20:14
FireBird Д'якон БД в Delphi 2 04.12.2008 11:15
FireBird 1.5.4 Nikola__ БД в Delphi 2 17.11.2008 14:42