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

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

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2015, 15:14   #1
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию SELECT последней дата оплаты болше на 10 дней

Здравствуйте ребята , на пример у меня структура такой
Код:
create table Credit
(
 c_id int identity(1,1) primary key ,
 c_date datetime not null, -- дата выдачи кредита 
 c_day integer not null,  -- день . = это на сколько дней дают кредит 
 c_fio varchar(30) not null, -- ФИО
 c_money money not null  -- Денег который забирает клиент
);
Принцип работы такой что клиент платит на эту кредиту 10% каждого 10-ого день на пример взял 10.04.2015 300 руб он должен 20.04.2015 заплатит 10% это 30 руб.
создаю еще таблица для процент
Код:
create table Procent
(
 p_id int identity(1,1),
 p_date datetime not null, -- Дата оплата эту процент
 p_money money , -- сумма 10% из выбраны денег --это все ручной набивается 
 p_CreditID int not null --FK
 constraint FK_proc foreign key (p_CreditID) references Credit(c_id) 
 on delete cascade
);
добавляем несколько запись таблицу Credit
Код:
insert into Credit (c_date, c_day, c_fio, c_money)
       values('2015-10-04',10, 'какой то васия', 250),
             ('2015-12-04',10, 'какой то петя', 270),
             ('2015-11-04',10,'какой то сергей', 300)
select * from Credit
и еще на Procent
Код:
 -- какой то васия заплатил 25 руб  
insert into Procent (p_date, p_money, p_CreditID)
       values('2015-20-04',25,1)
-- и это васия еще заплатил 25 руб ну уже 30.04.2015
 insert into Procent (p_date, p_money, p_CreditID)
       values('2015-30-04',25,1)
--  еще заплатил 25 руб ну уже 10.05.2015
  insert into Procent (p_date, p_money, p_CreditID)
       values('2015-10-05',25,1)
--  еще заплатил 25 руб ну уже 20.05.2015
 insert into Procent (p_date, p_money, p_CreditID)
       values('2015-20-05',25,1)
 select * from Procent
Сейчас я хочу выбрать то запись "Клиент который не заплатил процент на 10-ого день! и где последней дата оплаты больше на 10 дней"
пишу
Код:
 select c.c_id, c.c_date, c.c_day, c.c_fio, c.c_money, p.p_date, p.p_money
 from Credit c left join Procent p
 on c.c_id=p.p_CreditID
/*
  Клиент который не заплатил процент на 10-ого день!
   where DATEDIFF(DAY, c.c_date, GETDATE())> c.c_day
*/
 where DATEDIFF(DAY, c.c_date, GETDATE())> c.c_day
как мне еще добавить здесь второе условия последней дата оплаты болше на 10 дней
Код:
 -- так не магу отбрасывать это человек который платит во время 
 or DATEDIFF(DAY, p.p_date, GETDATE())> c.c_day
xxbesoxx вне форума Ответить с цитированием
Старый 23.05.2015, 17:40   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Было бы не плохо на пальцах показать что есть и что нужно из него получить, то есть в виде примера - исходные данные и результат. Приведенная же формулировка условия запроса не вписывается в мое понимание
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.05.2015, 18:28   #3
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Было бы не плохо на пальцах показать что есть и что нужно из него получить,
1) Огромное спасибо что уделили меня время .... вот что есть
Я хочу получить список клиентов который не заплатил 10-ого день процент И список то клиентов который заплатил, Но последней дата p.p_date и Getdate(), больше на c.c_day
Код:
where DATEDIFF(DAY, c.c_date, GETDATE())> c.c_day
дата который в таблицу Credit я его проверяю так . А как проверить дату который таблицу Procent
CONVERT там не причем, это просто для того что на скриншоте было понятно даты
Цитата:
исходные данные и результат. Приведенная же формулировка условия запроса
Да, Думаю как это результат получить как проверить последней дата оплаченный процент
Изображения
Тип файла: jpg БД.jpg (33.1 Кб, 77 просмотров)
Тип файла: jpg 1.jpg (38.5 Кб, 83 просмотров)
Тип файла: jpg 2.jpg (43.9 Кб, 127 просмотров)

Последний раз редактировалось xxbesoxx; 23.05.2015 в 19:05.
xxbesoxx вне форума Ответить с цитированием
Старый 23.05.2015, 19:17   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А это не одно и то же:
- клиент не заплативший во время процент
- клиент у которого после последней оплаты прошло больше оговоренного срока

Единственное отличие - во второе условие не попадут те, которые еще ни разу не платили. Но по первому условию они попадут, в него же попадут и все из 2-го условия
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.05.2015, 19:32   #5
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
А это не одно и то же:
Да правильно
Цитата:
во второе условие не попадут те, которые еще ни разу не платили. Но по первому условию они попадут
можно как то его решать на T-SQL что одно и второе попадал или лучше его решать на уровень Delphi потому что это результат я должен отображать на Grid в Delphi

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

Цитата:
Да правильно
Если правильно, то зачем оно нужно-то второе условие?
Код:
select * from Credit where DATEDIFF(DAY, c_date, GETDATE())> c_day
все. Если же имеется ввиду, что последний платеж с опозданием, то в таблицах уже и информации похоже нет, что бы это вычислить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.05.2015 в 19:54.
Аватар вне форума Ответить с цитированием
Старый 23.05.2015, 20:08   #7
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
зачем оно нужно-то второе условие?
Смотри друг это ---> "какой то васия" не должен здесь , после последние оплати еще не прошел оговоренного срок .
Цитата:
Если же имеется ввиду, что последний платеж с опозданием, то в таблицах уже и информации похоже нет,
на дочерние таблице не как его проверить ?
Смотри добавляю еще 1 клиент
Код:
insert into Credit (c_date, c_day, c_fio, c_money)
       values(GETDATE(),10, 'какой то Денис', 250)
и это условия работает
Код:
select * 
from Credit 
where DATEDIFF(DAY, c_date, GETDATE())> c_day
мне еще как проверить дата последние оплати Procent --- p_date
Изображения
Тип файла: jpg 5.jpg (36.9 Кб, 133 просмотров)

Последний раз редактировалось xxbesoxx; 23.05.2015 в 20:24.
xxbesoxx вне форума Ответить с цитированием
Старый 23.05.2015, 20:23   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Дошло. Тогда так
Код:
SELECT U.*
  FROM (SELECT C.*,(SELECT TOP 1 P.p_date FROM Procent P WHERE P.p_CreditID=C.c_id  ORDER BY P.p_date DESC) AS LastDateOpl FROM Credit C) U
  WHERE (U.LastDateOpl IS NULL AND DATEDIFF(DAY, U.c_date, GETDATE())> U.c_day) OR DATEDIFF(DAY, U.LastDateOpl, GETDATE())> U.c_day
без учета - полностью или нет сумма погашена
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.05.2015, 20:41   #9
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Аватар огромное вам человечки спасибо, да работает правильно. Вы много раз меня помогли. Дай вам бог здоровья , счастья и все хорошего
xxbesoxx вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить записи из таблицы, если дата в записи старше 30 дней Aleksandr БД в Delphi 10 28.03.2013 21:33
Осталось дней. Отсчет дней в программе diasouls Общие вопросы Delphi 4 01.09.2012 00:13
Правда ли что Windows xp 64 определяет болше Оперативки чем Windows xp 32 subbota Операционные системы общие вопросы 4 03.06.2012 17:29
диапазон времени действия(сист дата+-14 дней) slavikus Помощь студентам 9 23.07.2011 09:45
Вычитание дат(дата-дата=кол.дней) zallza Общие вопросы Delphi 1 31.05.2010 22:50