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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2019, 12:05   #1
Евгений Келер
 
Регистрация: 09.03.2019
Сообщений: 3
По умолчанию Фильтрация по дате SQL

Всем привет! Ребята, есть таблица "Delivery", в ней поле "FDATE", в которое надо записать дату поставки. Формат поля "Краткий формат даты", маска ввод 00/00/0000/0_
База данных Access 2002-2003 *.mdb

Суть проблемы:
1) Когда из делфи запросом добавляю запись в таблицу Delivery access меняет местами день и месяц в дате. Причем меняет выборочно, т.е. если день в промежутке от 1 до 12, то заменяет, если больше, то записывает как надо.
Пример: дата 08.02.2019 сохраняется как 02.08.2019, а 14.02.2019 сохраняется как надо.

2) При выборке из таблицы Delivery нужно указать период поставок.
Нижеописанный запрос возвращает пустой набор данных.
SELECT *
FROM Delivery
WHERE Delivery.FDATE BETWEEN #01/02/2019# AND #02/03/2019#
ORDER BY Delivery.FDATE, Delivery.ID_Deliver;

Если меняю период дат, он выдает набор данных с поставками, но диапазон дат не соответствует.

К примеру, нижеописанный запрос возвращает поставки в указанный период, но к ним добавляет поставки за 05.03.2019:

SELECT *
FROM Delivery
WHERE Delivery.FDATE BETWEEN #28/02/2019# AND #04/03/2019#
ORDER BY Delivery.FDATE, Delivery.ID_Deliver;


Пытался заменить BETWEEN на простое условие >= and <=, но результат тот же.


__________
Почему с датами всегда все сложно?
Все гениальное просто...
Евгений Келер вне форума Ответить с цитированием
Старый 09.03.2019, 12:23   #2
Евгений Келер
 
Регистрация: 09.03.2019
Сообщений: 3
По умолчанию

Вот сама БД.
У меня основной задачей является отображение информации о поставках за определенный период.
Сперва в программе я выбираю от кого отобразить поставки (от физ. лиц или организаций), затем выбираю период поставок: 2 компонента TDateTimePicker, после чего запрашиваю из БД набор данных:
Код:
with adoqDelivery do
      begin
        Close;
        // Преобразуем дату в формат "00/00/0000"
        Date1 := StringReplace(DateToStr(DateTimePicker1.Date), '.', '/',
          [rfIgnoreCase, rfReplaceAll]);
        Date2 := StringReplace(DateToStr(DateTimePicker2.Date), '.', '/',
          [rfIgnoreCase, rfReplaceAll]);

        SQL.Text := 'SELECT Delivery.FDATE, FizFace.FIO, ' +
          'FizFace.PASSPORT, FizFace.ADDRESS, FizFace.PHONE, ' +
          'Product.NAIM, Product.FYEAR, Delivery.FCOUNT, Delivery.PRICE, ' +
          'Delivery.ID_PRODUCT, Delivery.ID FROM Product INNER JOIN ' +
          '(FizFace INNER JOIN Delivery ON FizFace.ID = Delivery.ID_Deliver) ' +
          'ON Product.ID = Delivery.ID_PRODUCT ' + 'WHERE ' +
          '(((FDATE) BETWEEN #' + Date1 + '# AND #' + Date2 + '#) ' +
          'AND ((TYPE_DELIVER)=True)) ORDER BY Delivery.FDATE;';
        Open;
      end;
Запрос нормально все отображает, за исключением фильтра по датам. Он либо возвращает пустой набор данных, либо отображает записи, в которых дата поставки отклоняется на день-два от диапазона, указанного в BETWEEN
Вложения
Тип файла: zip Delivery.zip (29.1 Кб, 8 просмотров)
Все гениальное просто...

Последний раз редактировалось Евгений Келер; 09.03.2019 в 12:25. Причина: Дополнил
Евгений Келер вне форума Ответить с цитированием
Старый 09.03.2019, 13:11   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В Date еще вообще-то и время есть. И о параметризованных запросах не слышал? Типа такого
Код:
var d1: TDateTime;

  ADOQuery1.Close;
  ADOQuery1.SQL.Text:='select * from Delivery where fdate=:DateFrom';
  d1:=Trunc(DateTimePicker1.Date);
  ADOQuery1.Parameters.ParamByName('DateFrom').Value:=d1;
  ADOQuery1.Open;
PS для INSERT или UPDATE из делфи тоже применяй параметризованный запрос и не будет болячки с датами
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.03.2019 в 13:20.
Аватар вне форума Ответить с цитированием
Старый 09.03.2019, 14:11   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Используйте параметрический запрос

http://www.programmersforum.ru/showp...18&postcount=2

Цитата:
Сообщение от Евгений Келер Посмотреть сообщение
/ Преобразуем дату в формат "00/00/0000"
Даты не надо никуда преобразовывать.

Цитата:
Сообщение от Евгений Келер Посмотреть сообщение
затем выбираю период поставок: 2 компонента TDateTimePicker
там содержится не только дата, но время, поэтому нужно отрезать временную часть,
например, через Trunc()

http://www.programmersforum.ru/showp...18&postcount=2


ДОБАВЛЕНО
Цитата:
Сообщение от Аватар Посмотреть сообщение
И о параметризованных запросах не слышал? Типа такого
Упс.. я опоздал и повторил то же самое. Извините...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.03.2019, 19:54   #5
Евгений Келер
 
Регистрация: 09.03.2019
Сообщений: 3
По умолчанию

Понял. Спасибо большое.
А насчет коммента "Преобразования даты к виду 00/00/0000" - в DateTimePicker она хранится в виде 00.00.0000, а access в запросе требует слеш, а не точку. На этом месте кода ошибка была, прошлось поменять вид даты.

А разве передавая в переменную значение DateTimePicker1.Date я получаю не только дату?

И да, я не слышал о параметризованных запросах, но это исправлю.
Все гениальное просто...

Последний раз редактировалось Евгений Келер; 09.03.2019 в 19:56.
Евгений Келер вне форума Ответить с цитированием
Старый 09.03.2019, 20:03   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
в DateTimePicker она хранится в виде 00.00.0000
Дата хранится в формате плавающего числа. Целая часть - дата, дробная - время. В access тоже. А отображаться может по разному, как отформатируешь так и будет
Цитата:
А разве передавая в переменную значение DateTimePicker1.Date я получаю не только дату?
Код:
ShowMessage(DateTimeToStr(DateTimePicker1.Date));
и вопросы отпадут
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.03.2019 в 20:09.
Аватар вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фильтрация по дате ДневнойДоширак Общие вопросы Delphi 3 06.08.2017 09:12
Фильтрация по дате qqwweertyy Помощь студентам 0 22.12.2016 19:23
фильтрация по дате delfin07 C++ Builder 0 04.06.2012 09:34
Фильтрация по дате в ADO AlexSol.BY Помощь студентам 5 07.12.2010 10:32
Фильтрация по текущей дате DimOn4Ik БД в Delphi 4 25.04.2010 21:48