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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2016, 10:46   #21
netpolice
Форумчанин
 
Аватар для netpolice
 
Регистрация: 14.02.2013
Сообщений: 222
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
то в результат попадет и 01.11.2001 00:00:00
Ну это то понятно....

К стати - юридически 01.11.2001 00:00:00, это еще 31.10.2001
netpolice вне форума Ответить с цитированием
Старый 30.03.2016, 10:51   #22
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

У меня в формате месяц день год. Впрочем не важно. Первый раз слышу, что нулевое время это предыдущая дата
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.03.2016 в 11:17.
Аватар вне форума Ответить с цитированием
Старый 30.03.2016, 10:55   #23
netpolice
Форумчанин
 
Аватар для netpolice
 
Регистрация: 14.02.2013
Сообщений: 222
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
У меня в формате день месяц год. Впрочем не важно. Первый раз слышу, что нулевое время это предыдущая дата
Это из серии с какого года начинается 21 век, с 2000 или 2001
netpolice вне форума Ответить с цитированием
Старый 30.03.2016, 11:15   #24
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
В таком виде, а то в коде ТС черт ногу сломает
Аватар, спасибо, теперь увидел!
ранее я не мог разглядеть скобку, закрывающую внутренний подзапрос!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.03.2016, 13:44   #25
dima1208
Пользователь
 
Регистрация: 02.11.2015
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В таком виде, а то в коде ТС черт ногу сломает
Код:
SELECT login_id, login.date_log as log_in,
    (select top 1 date_log
       from log_table as logout
       where logout.log_state = 'OUT'
             AND logout.date_log > login.date_log
             AND logout.login_id = login.login_id
       ORDER BY logout.date_log) AS log_out,
    mac, mt.family as fio
  FROM log_table as login
    LEFT JOIN main_table mt ON login.login_id = mt.login
  WHERE login.log_state = 'IN'
        AND login.date_log >= '01.01.2001'
        AND login.date_log <= '01.10.2001'
        AND login.login_id = login.login_id
Не прокатит, если в date_log еще и время есть. Если без времени, то конечно BETWEEN оптимальней
Простите, просто из delphi кусок скопировал...

Я не могу понять как из main_table взять фамилию к нужному логину.
Поле login есть в обеих таблицах (в main_table называется LOGIN, в log_table - LOGIN_ID).
Еще пробовал без JOIN, писал
Код:
FROM log_table as login, main_table as mt WHERE mt.login = login.login_id
и в фио на все записи добавляется первая фамилия из базы...

Если без джоина то как правильно написать после WHERE? Вложенный селект делать?
dima1208 вне форума Ответить с цитированием
Старый 31.03.2016, 08:48   #26
dima1208
Пользователь
 
Регистрация: 02.11.2015
Сообщений: 12
По умолчанию

Переделал запрос на такой:

Код:
SELECT main.family, main.login, login.date_log as log_in,
             (select top 1 date_log from log_table as logout
             WHERE logout.log_state = 'OUT'
             AND logout.date_log > login.date_log
             AND logout.login_id = login.login_id
             ORDER BY logout.date_log) AS log_out, mac
             FROM main_table as main
              LEFT JOIN log_table as login ON login.login_id = main.login
               AND login.log_state = 'IN'
               AND login.date_log >= ДАТА1
               AND login.date_log <= ДАТА2
                WHERE login.login_id = main.login;
После запроса выполняется такой код, добавляет таблицу в excel:

Код:
    Sheet.Cells[i,1] := ADOQuery2.FieldByName('log_in').AsString;
    Sheet.Cells[i,2] := ADOQuery2.FieldByName('log_out').AsString;
    Sheet.Cells[i,3] := ADOQuery2.FieldByName('mac').AsString;
    Sheet.Cells[i,4] := ADOQuery2.FieldByName('login').AsString;
    Sheet.Cells[i,5] := ADOQuery1.FieldByName('family').AsString;
Все отрабатывает нормально, но все равно в поле FAMILY одна первая фамилия из базы. Что я делаю не так?

Последний раз редактировалось dima1208; 31.03.2016 в 12:06.
dima1208 вне форума Ответить с цитированием
Старый 31.03.2016, 08:52   #27
dima1208
Пользователь
 
Регистрация: 02.11.2015
Сообщений: 12
По умолчанию

Вопрос закрыт! Всем спасибо!
Когда прочитал свой последний пост - увидел, что FAMILY бралось из ADOQuery1.
Все из-за невнимательности)))
dima1208 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа записи DVD на основе данных MS SQL (15 000) acetgi Фриланс 4 20.12.2013 09:43
не работает поиск по бд Access на основе sql приложение написано в delphi Elizaveta007 БД в Delphi 4 19.08.2013 10:10
Организация одноноправленного списка на основе рекурсивных типов данных в виде стека [Delphi] Kristina93 Помощь студентам 0 31.12.2012 21:41
Задачи: Сортировка символьной информации в строке, заданной пользователем.; Чтение и запись данных в файл (Assembler,TASM) User22 Помощь студентам 2 01.12.2011 11:40
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15