Главная страница
    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.48 MB
Время: 0.007 c
14-45527
Bambuk
2002-09-18 23:03
2002.10.14
http://ixbt.com/multimedia/sven-audio/4.jpg


1-45386
Zuvom
2002-09-25 12:33
2002.10.14
dll


6-45479
Сергей Ф
2002-07-05 16:51
2002.10.14
Как узнать, доступен ли компьютер с заданным ip-адресом в LAN?


14-45521
Ketmar
2002-09-13 15:33
2002.10.14
цитатка с


1-45252
tv
2002-10-04 11:06
2002.10.14
Освобождение элементов методом Free





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский