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


Автор: kovalenko123 17.12.2008, 17:50
Здравствуйте уважаемые программисты! 
Столкнулся с такой задачей: надо профильтровать БД и вывести всех людей у кого сегодня день рожденья, 
написал вот такую ерунду

Код

with adoquery1 do
begin
  Close;
  SQL.Text:='select * from [Table]  WHERE Дата Like "01.12.2008"'; // вот так отображаеться а если * нет
  Open;
end;


Все проблема в том что мне сдесь не нужен год, а когда вместо года в запросе ставлю * то ниче не отображаеться

помогите пожалуйста. 

(я смотрел на форуме похожие темы и ответа в них не нашел) 

Автор: Akella 17.12.2008, 19:43
http://forum.vingrad.ru/forum/topic-233250/kw-%D0%B4%D0%B0%D1%82%D0%B0-firebird-%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D1%82%D1%8C-%D0%B4%D0%B0%D1%82%D1%8B.html даны ответы и есть ссылки на др. сайты. Дерзай.

Автор: Akella 17.12.2008, 19:59
http://www.sql.ru/forum/actualthread.aspx?tid=612122 ещё

Автор: kovalenko123 18.12.2008, 19:13
Спасибо за ссылки! 

опираясь на них я написал 

Код

 with adoquery1 do
    begin
      Active := False;
      SQL.Text := 'SELECT * FROM [Table] WHERE (EXTRACT(MONTH FROM table."Дата") = :Par1';
      Parameters[0].Value := DateToStr(DateTimePicker1.date);
      ExecSQL;
      Open;
    end;


Говорит не опознанная ошибка... 

подскажи пожалуйста что тут не так  smile 

Автор: Akella 18.12.2008, 19:36
убери ExecSQL
и почитай, для чего ExecSQL, а для чего Open, т.е. в каких случаях что нужно использовать

Добавлено через 7 минут и 37 секунд
Ты так и не понял.
DateToStr(DateTimePicker1.date) засунет в запрос всю дату, т.е. вместе с годом.

Я не знаю синтаксиса акцесса. 
http://forum.vingrad.ru/index.php?showtopic=233250&view=findpost&p=1676385
Посмотри и подумай, как можно в акцесс заменить EXTRACT

Вот ещё
http://forum.vingrad.ru/index.php?showtopic=233250&view=findpost&p=1676388


Вот ещё
http://forum.vingrad.ru/index.php?showtopic=233250&view=findpost&p=1676397

Вот ещё
http://forum.vingrad.ru/index.php?showtopic=233250&view=findpost&p=1679001


Вот ещё сортировка
http://forum.vingrad.ru/index.php?showtopic=233250&view=findpost&p=1690254
http://forum.vingrad.ru/index.php?showtopic=233250&view=findpost&p=1690298


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

Автор: kovalenko123 19.12.2008, 18:48
все равно спасибо за помошь!! (была бы возможность дал бы сразу 100 балов!!! )

но похоже запросы в ib отличаються от акцсесса (( и опять не опознанная ошибка


(а команда ExecSQL применяется для запросов не возвращающих результат, вроде так  )

Автор: Akella 21.12.2008, 10:34
Цитата(kovalenko123 @  19.12.2008,  18:48 Найти цитируемый пост)
(а команда ExecSQL применяется для запросов не возвращающих результат, вроде так  )

да, поэтому в твоём случае только Open

Добавлено через 4 минуты и 41 секунду
так пробовал?
Код

SQL.Text:='select * from [Table]  WHERE Дата Like "01.12.%"';

возможно, что вместо знака процента в акцессе используется др. символ, а вместо двойных кавычек можно так попробовать
Код

SQL.Text:='select * from [Table]  WHERE Дата Like '+QuotedStr('01.12.%');

Автор: kovalenko123 21.12.2008, 11:04
Да, я так пробовал и получилось, но мне же надо datetimepickerom в like загонять а не так "01.12.%"
а это вряд ли получиться (( 

Автор: Данкинг 21.12.2008, 12:59
Разбей в самой таблице дату на три столбца - день, месяц, год, и не парься.  smile 

Автор: Kbl4AH 21.12.2008, 14:10
Цитата(Данкинг @  21.12.2008,  12:59 Найти цитируемый пост)
Разбей в самой таблице дату на три столбца - день, месяц, год, и не парься.

Ничего разбивать не нужно... Нужно обрезать год в строке...
Код

SQL.Text:='select * from [Table]  WHERE Дата Like left(''01.12.2008'', 6)'

А разве, чтобы 
Код
'
 в строке написать 
Код
"
 используется? По-моему, 
Код
''

P.S. А вообще, нужно дату в типе даты, а не строковом хранить...

Автор: Данкинг 21.12.2008, 14:19
Цитата(Kbl4AH @  21.12.2008,  14:10 Найти цитируемый пост)
А вообще, нужно дату в типе даты, а не строковом хранить...

Кстати, я обычно храню в строковом. Чтобы не было проблем со всякими "региональными настройками". smile 

Автор: Kbl4AH 21.12.2008, 14:32
Цитата(Данкинг @  21.12.2008,  14:19 Найти цитируемый пост)
Кстати, я обычно храню в строковом. Чтобы не было проблем со всякими "региональными настройками". 

Я раньше тоже в строковом хранил, так как мне это казалось удобнее...
Пока со следущим не столкнулся:
выбираю поле даты(строковое) датасетом и вставляю в грид... текст запроса такой (чтобы можно было сразу изменять таблицу стандартными возможностями)
Код

SELECT data, rowid FROM table

В этом случае сортировка неправильная происходит (сортируется как строка, а не дата)...
Если делаю так:
Код

SELECT to_date(data, 'dd.mm.yyyy'), rowid FROM table
, то сортируется правильно, но тогда ошибка при изменении/вставке в таблице (попытка сохранить тип ДАТА в тип СТРОКА)...

P.S. А какие могут быть проблемы с региональными настройками? В делфи тип ДАТА, в БД тип ДАТА... Все нормально должно быть.. 
Главное, чтоб в делфи ошибки из-за настроек не было при конвертациях всяких, а БД сама "догадается" в каком формате дату вывести..

Автор: Данкинг 21.12.2008, 14:39
Цитата(Kbl4AH @  21.12.2008,  14:32 Найти цитируемый пост)
В этом случае сортировка неправильная происходит (сортируется как строка, а не дата)...

Если потом выбирать сортировать нужно - тогда дело иное.

Цитата(Kbl4AH @  21.12.2008,  14:32 Найти цитируемый пост)
А какие могут быть проблемы с региональными настройками?

А всякие там порядки отображения даты, например?

Автор: Kbl4AH 21.12.2008, 14:42
Цитата(Данкинг @  21.12.2008,  14:39 Найти цитируемый пост)
А всякие там порядки отображения даты, например?

Так это ведь уже над переменной делается... А тип он и есть тип... он для любых настроек одинаков... Ведь, по-моему, в БД дата хранится в полном формате (со временем), а уже отображается в предпочтительном виде... В любом случае представление переменной типа дата от самого типа не зависит...
... или я чего-то не понимаю... Можно пример в таком случае?

Автор: kovalenko123 21.12.2008, 16:26
Цитата

Разбей в самой таблице дату на три столбца - день, месяц, год, и не парься


Ну это же глупость smile 

Код

SQL.Text := 'select * from [Table]  WHERE Дата Like left(''01.12.2008'', 6)';

а вот этот код ничего не вернул  smile 
так опять же мне надо в like вставить дату из Datetimepickera тока чтоб год не учитывался  smile
а как это сделать незнаю  smile   

Автор: Данкинг 21.12.2008, 18:12
Цитата(Kbl4AH @  21.12.2008,  14:42 Найти цитируемый пост)
Можно пример в таком случае? 

Я теперь и сам уже сомневаюсь.  smile Вероятно, всё же, ты прав. Был случай у меня: в таблице поле с датой - текстовое. На одних компах, с которых программа (подсчёт рабочего времени сотрудников) вносила инфу, год был указан двухзначный, а на других - четырёхзначный. Вот и получилось, что поскольку один человек мог отмечаться с разных компов, то с подсчётом времени получался какой-то там косяк (не помню точно, какой). smile 

Цитата(kovalenko123 @  21.12.2008,  16:26 Найти цитируемый пост)
Ну это же глупость

Почему это глупость?! А хранить ФИО разбитым по полям - тоже глупость?!

В общем, на Access (проверял именно в самом .MDB) вот такой запрос у меня работает:
Код

select * from table where left(cstr(data),5)="18.01"

Автор: Kbl4AH 21.12.2008, 19:39
Цитата(kovalenko123 @  21.12.2008,  16:26 Найти цитируемый пост)
SQL.Text := 'select * from [Table]  WHERE Дата Like left(''01.12.2008'', 6)';
а вот этот код ничего не вернул

может ничего и не должен вернуть? может нет записей удовлетворяющих условию?
функция верная, я проверял пробными запросами...
Для MS SQL
Код

select left('01.12.2008', 6) from table;

вернет 01.12.
че за SQL у тебя используется? Может там другая функция? Хотя, если бы функция LEFT не работала, то ошибка бы выдавалась...
Проверь, точно у тебя есть запись с такой датой 01.12.хххх?

А, погодь... косяк... надо так...
Код

select * from [Table]  WHERE Дата Like left('01.12.2008', 6) || '%';


P.S. kovalenko123, проверь в самом SQL Builder, что запрос возвращает...

Автор: Akella 22.12.2008, 10:35
Данкинг, думаю, что ты неправильно делаешь, не зря ведь придумали специальный тип Дата в базах данных. Можно ж было как boolean хранить 0 или 1.

Автор: Данкинг 22.12.2008, 11:43
Цитата(Akella @  22.12.2008,  10:35 Найти цитируемый пост)
думаю, что ты неправильно делаешь

Что делаю - храню дату как строку? Да я и не спорю, что неправильно. smile 

Автор: kovalenko123 22.12.2008, 18:47
Данкинг, 

Код

select * from table where left(cstr(data),5)="18.01"

Код сработал  smile 
а как теперь его с datetimepickerom связать ?? 
я попробовал
Код

 with adoquery1 do
    begin
      Active := False;
      SQL.Text := 'select * from [Table] where left(cstr(Дата),6)="DateTimePicker1.date"';
      Open;
    end;


но ничего не выходит.... что можно сделать ? 
Kbl4AH, 
не там точно есть запись на 01.12.2008 

Автор: Kbl4AH 22.12.2008, 19:45
Код

ShortDateFormat := 'dd.mm';
with adoquery1 do
    begin
      Active := False;
      SQL.Text := 'select * from [Table] where left(cstr(Дата), 5) = ''' + DateToStr(DateTimePicker1.Date) + '''';
      Open;
    end;

или
Код

var
  Data: string;
......................
with adoquery1 do
    begin
      Active := False;
      DateTimeToString(Data, 'dd.mm', DateTimePicker1.Date);  
      SQL.Text := 'select * from [Table] where left(cstr(Дата), 5) = ''' + Data + '''';
      Open;
    end;

Автор: Данкинг 22.12.2008, 19:50
Kbl4AH, а значение datepicker'а почему не обрезал? smile 

Код

ShortDateFormat := 'dd.mm';
with adoquery1 do
    begin
      Active := False;
      SQL.Text := 'select * from [Table] where left(cstr(Дата), 5) = ''' +copy(DateToStr(DateTimePicker1.Date),1,5) + '''';
      Open;
    end;

Автор: Kbl4AH 22.12.2008, 19:55
Цитата(Данкинг @  22.12.2008,  19:50 Найти цитируемый пост)
Kbl4AH, а значение datepicker'а почему не обрезал?

А оно уже обрезанное в следствие использования ShortDateFormat := 'dd.mm';  smile 
P.S. Хотя лучше без формата даты... мне твоя обрезка строки больше понравилась... просто мне это в голову не пришло smile 

Автор: Akella 22.12.2008, 20:24
товарищи  smile , а если на компьютере будет формат даты немного не "28.12.2008"

Автор: Kbl4AH 22.12.2008, 20:25
Цитата(Akella @  22.12.2008,  20:24 Найти цитируемый пост)
товарищи   , а если на компьютере будет формат даты немного не "28.12.2008"

И что?
Я для этого ShortDateFormat := 'dd.mm'; и использовал...
Проверил, поставил американский формат... примеры работают...
А с обрезкой строки, и правда, косяк будет...

Автор: Akella 22.12.2008, 20:29
Kbl4AH,  smile я не тебе

Добавлено через 2 минуты и 8 секунд
Цитата(kovalenko123 @  22.12.2008,  18:47 Найти цитируемый пост)
 with adoquery1 do
    begin
      Active := False;
      SQL.Text := 'select * from [Table] where left(cstr(Дата),6)="DateTimePicker1.date"';
      Open;
    end;


переделай на
Код

    begin
      Active := False;
      SQL.Text := 'select * from [Table] where left(cstr(Дата),6)="DateTimePicker1.date"';
ShowMessage(SQL.Text);
      Open;
    end;

И ты увидишь то, что получит SQL сервер. А когда увидишь, то подумай, знает ли SQL сервер про твой DateTimePicker1? smile 

Автор: Kbl4AH 22.12.2008, 20:32
Цитата(Akella @  22.12.2008,  20:29 Найти цитируемый пост)
И ты увидишь то, что получит SQL сервер. А когда увидишь, то подумай, знает ли SQL сервер про твой DateTimePicker1?

 smile 

Автор: kovalenko123 23.12.2008, 13:57
Kbl4AH, 
А с обрезкой строки, и правда, косяк будет...
а какой косяк?? 

твой пример 
Код

procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
  Data: string;
begin
 with adoquery1 do
    begin
      Active := False;
      DateTimeToString(Data, 'dd.mm', DateTimePicker1.Date);
      SQL.Text := 'select * from [Table] where left(cstr(Дата), 5) = ''' + Data + '''';
      Open;
    end;
end;

Работает ! огромное спасибо !!!
а так же спасибо  всем кто принимал участие в обсуждении!!!

Автор: Kbl4AH 23.12.2008, 14:27
Цитата(kovalenko123 @  23.12.2008,  13:57 Найти цитируемый пост)
А с обрезкой строки, и правда, косяк будет...а какой косяк??

Допустим дата 10 декабря 2008 года...
русский формат             10.12.2008       после вырезки первых 5ти символов будет           '10.12'
американский формат   12/10/2008      после вырезки первых 5ти символов будет           '12/10'
а при конвертации DateTimeToString(результат: string, 'dd.mm', дата: TDateTime)    всегда получится строка того формата, который указан в процедуре, в данном случае '10.12'.... и без разницы стандарт даты какой страны будет на компьютере...       

Автор: kovalenko123 23.12.2008, 18:37
Так я дату та в базе хроню, мне разве не пофиг какой стандарт на компе стоит? и потом у меня на заполнение используеться "русский формат" и  запрос я делаю "русским" поэтому косяков быть не должно   smile  

Автор: Kbl4AH 23.12.2008, 19:34
У тебя и не будет косяков... Они при запуске твоей проги на другом компьютере были бы возможны...
Универсальной прога должна быть в идеале...

Автор: Akella 23.12.2008, 20:11
Цитата(kovalenko123 @  23.12.2008,  18:37 Найти цитируемый пост)
мне разве не пофиг какой стандарт на компе стоит?

тебе ж сказали, что DateTimePicker передаёт НЕ ТАК КАК ТЫ ХОЧЕШЬ, а так, как указано в ОСи

Автор: kovalenko123 24.12.2008, 18:33
Понял, Спасибо!

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