Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];

Вниз

Борюсь с запросом в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
4-45641
Ipjack
2002-09-01 03:55
2002.10.14
Определение статуса клавиши shift


1-45405
lakich
2002-10-03 10:30
2002.10.14
Список процессов


14-45535
loki2000
2002-09-19 12:37
2002.10.14
Компонента для доступа к DBF, без BDE?


3-45178
RDA
2002-09-21 10:55
2002.10.14
Борюсь с запросом в ADOQuery - проблема с датой


1-45319
Slava V.
2002-10-04 22:18
2002.10.14
Получение версии своего же приложения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский