Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.14;
Скачать: CL | DM;

Вниз

Борюсь с запросом в ADOQuery - проблема с датой   Найти похожие ветки 

 
RDA ©   (2002-09-21 10:55) [0]

procedure TfmFilter.SetFilter;
const
Text="SELECT N_PLAT, NOMER, DATA, NAZV_P, RRAX_P, NAZV_O, RRAX_O, SUMA, PRIZN FROM PLAT WHERE (P_PRED=";
var
Str:String;
begin
with DM do
begin
QueryFilter.Active:=False;
QueryFilter.SQL.Clear;
if ENazv_P.Text<>"" then Str:=Str+" AND (NAZV_P="""+ENazv_P.Text+""")";
if ERRax_P.Text<>"" then Str:=Str+" AND (RRAX_P="""+ERRax_P.Text+""")";
if ENazv_O.Text<>"" then Str:=Str+" AND (NAZV_O="""+ENazv_O.Text+""")";
if ERRax_O.Text<>"" then Str:=Str+" AND (RRAX_O="""+ERRax_O.Text+""")";
//Ошибка
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+Start_D.Text+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+Stopt_D.Text+")";
QueryFilter.SQL.Add(Text+PREDN_PRED.AsString+")"+Str);
QueryFilter.Active:=True;
end;
end;

Пробовал так
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+"#"+Start_D.Text+"#"+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+"#"+Stopt_D.Text+"#"+")";
Ошибок нет но записи соответствующие условию не отбираються
Так ошибка
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+"#"+FormatDateTime("mm.dd.yyyy",Start_D.Date)+"#"+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+"#"+FormatDateTime("mm.dd.yyyy",Stopt_D.Date)+"#"+")";


 
Balu ©   (2002-09-21 11:20) [1]

Попробуй так:
FormatDateTime(" yyyymmdd hh:mm", Start_D.Date)
или так
FormatDateTime(" #mm/dd/yyyy hh:mm#", Start_D.Date)
Если время не нужно то без hh:mm.


 
RDA ©   (2002-09-21 11:52) [2]

>> пробовал - не помогает.
Кстати от чего зависит формат даты - не от региональных ли установок. Смотрел в Аксесе - дата в поле храниться нормально в соответствии с моими рег. установками "dd.mm.yyyy" - или она может только показывется в соответствии с установками - а храниться в другом формате?


 
sniknik ©   (2002-09-21 12:18) [3]

Access принимает два формата dd.mm.yyyy и mm.dd.yyyy без всяких установок на свое усмотрение. короче определенности нет.
завязывай боротся переходи на

Syntax
DateSerial(year, month, day)
The DateSerial function syntax has these named arguments:

пример
select DateSerial(1990 - 10, 8 - 2, 1 - 1)


 
RDA ©   (2002-09-21 13:32) [4]

>> sniknik - не разобрался.
Дошел вот до чего
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+FormatDateTime("#dd.mm.yy#",Start_D.Date)+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+FormatDateTime("#mm.mm.yy#",Stopt_D.Date)+")";

Если ввести только стартовую дату - фильтрует.
Если только конечную или обе - не фильтрует, но и ошибок не выдает.


 
RDA ©   (2002-09-21 13:39) [5]

Ошибся
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+FormatDateTime("#dd.mm.yy#",Start_D.Date)+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+FormatDateTime("#dd.mm.yy#",Stopt_D.Date)+")";



 
sniknik ©   (2002-09-21 18:37) [6]

ты сначала без формата простой запрос тестируй, а после переменные задавай а то непонятно

пример с аксесом работает
SELECT * FROM Billing WHERE Log = #29/03/1996 1:38:52#
сдесь и время т.к в этой базе лог одного дня (мне так видно что отбор идет)
но основное западло, если написать
SELECT * FROM Billing WHERE Log = #03/29/1996 1:38:52#
то в выборку попадут те же записи (по мне лутше бы в одном случае ошибка была)
т.е. 03/04 можно интерпретировать по разному, согласен?

выбрать промежуток
SELECT * FROM Billing WHERE Log BETWEEN #03/29/1996 1:38:52# AND #03/29/1996 1:39:29#
а вот тут если в одном условии написать 03/04 то выбор будет однозначен т.к. второе задает 03/29, 29 явно день месяцем быть не может. короче запутатся легко.


 
RDA ©   (2002-09-21 18:59) [7]

>>sniknik - устал. Сил нет с этим запросом.
SELECT * FROM PLAT WHERE DATA >= #18.09.02# AND DATA <= #20.09.02# - не работает.
SELECT * FROM PLAT WHERE DATA >= #18.09.02# - работает.

В базе всего две записи - обе с датой 19.09.02
Пробовал через промежуток с BETWEEN - не работает.


 
RDA ©   (2002-09-21 19:11) [8]

Хуже того
SELECT * FROM PLAT WHERE DATA=#19.09.02# - не отбирает записи, а они есть.


 
aus ©   (2002-09-21 22:38) [9]

Рабочий вариант:
select * from Table1 where Data = DateValue("01.01.02")


 
sniknik ©   (2002-09-21 23:10) [10]

А так?
SELECT * FROM PLAT WHERE DATA >= #18/09/2002# AND DATA <= #20/09/2002#


 
sniknik ©   (2002-09-21 23:13) [11]

когда делаеш равенство смотри на время. если забито в таблице то и в условии должно быть.


 
RDA ©   (2002-09-22 09:39) [12]

Всем спасибо. Три дня мучений закончились. Особенную благодарсность выражаю sniknik - спасибо.

Рабочий вариант оказался таким:

procedure TfmFilter.SetFilter;
const
Text="SELECT N_PLAT, NOMER, DATA, NAZV_P, RRAX_P, NAZV_O, RRAX_O, SUMA, PRIZN FROM PLAT WHERE (P_PRED=";
var
Str:String;
begin
DateSeparator:="/";
with DM do
begin
QueryFilter.Active:=False;
QueryFilter.SQL.Clear;
if ENazv_P.Text<>"" then Str:=Str+" AND (NAZV_P="""+ENazv_P.Text+""")";
if ERRax_P.Text<>"" then Str:=Str+" AND (RRAX_P="""+ERRax_P.Text+""")";
if ENazv_O.Text<>"" then Str:=Str+" AND (NAZV_O="""+ENazv_O.Text+""")";
if ERRax_O.Text<>"" then Str:=Str+" AND (RRAX_O="""+ERRax_O.Text+""")";
if Start_D.Text<>"" then Str:=Str+" AND (DATA >= "+FormatDateTime("#dd/mm/yyyy#",Start_D.Date)+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA <= "+FormatDateTime("#dd/mm/yyyy#",Stopt_D.Date)+")";
QueryFilter.SQL.Add(Text+PREDN_PRED.AsString+")"+Str);
QueryFilter.Active:=True;
end;
DateSeparator:="."; // Не уверен что в этой строчке есть необходимость, ну да более мудрые товарищи подскажут - если захотят.
end;


>> aus А что это за функция DataValue


 
sniknik ©   (2002-09-22 12:04) [13]

запусти Access сделай любой модуль (зайдеш в бейсик) и нажми F1, если в этот момент курсор будет стоять на имени функции то сразу получиш спровку типа этой. не будет стоять :-) поищеш в справочнике.

DateValue(date)
The required date argument is normally a string expression representing a date from January 1, 100 through December 31, 9999. However, date can also be any expression that can represent a date, a time, or both a date and time, in that range.

посмотри еще DateSerial, удобно составлять дату можно делать операции с датами непосредственно не через DateAdd.

DateSeparator- системная переменая разделитель даты, не уверен что в ней есть необходимость в данном случае, Jet по моему на нее внимания не обращает.
видел гдето в хелпе ссылку типа "установите этот параметр чтобы действовали системные настройки" но где не помню и по умолчанию это не действует.



Страницы: 1 вся ветка

Текущий архив: 2002.10.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
1-45455
soware
2002-10-03 08:13
2002.10.14
Колесо МЫШИ


14-45526
MsGuns
2002-09-18 13:33
2002.10.14
Нужен совет с чего начать уже немолодому


1-45277
Zhenek
2002-10-04 07:23
2002.10.14
Помогите


3-45214
Soft
2002-09-20 17:35
2002.10.14
Удаление повторяющихся полей с помощью SQL HELPPP!!!!!!


1-45284
Коля Н
2002-10-02 15:14
2002.10.14
Hint на нарисованнцю кнопку.