Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603

Выполнять INSERT каждого дня только 1 раз

22.07.2015, 00:36. Показов 1750. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте . Работаю MS SQL есть такой две таблица
T-SQL
1
2
3
4
5
create table Tab1
(id int identity(1,1) primary key,
 dt datetime default getdate(),
 mon money,
)
и
T-SQL
1
2
3
4
5
6
7
create table Tab2
(id int identity(1,1),
 dt datetime default getdate(),
 mon money,
 Tab1ID int not null,
 constraint FK_tab2 foreign key (Tab1ID) references Tab1(id) on delete cascade
);
добавляю несколько запись на Tab1
T-SQL
1
2
3
insert into Tab1(mon) values(200),
                            (300),
                            (400)
Вопрос: Я хочу что это код выполнялось каждого дня только 1 раз
T-SQL
1
2
3
4
5
6
insert Tab2(mon, Tab1ID)
select mon/100*1 ,id
from Tab1
where exists(select mon, Tab1ID
             from Tab2 
             where Tab1.id=Tab2.Tab1ID)
Скажите пожалуйста как это реализовать ?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2015, 00:36
Ответы с готовыми решениями:

UPDATE Выполнять каждого дня
Добрый вечер . Примерно есть 2 таблица такой create table Credit(C_id int identity(1,1), C_date datetime default...

Запрос (INSERT) успешно выполняется 88 раз, но по факту в базе находится только 5 строк. КАК?
Код: $cday = (int)date('j'); $stmt2 = $db->prepare("INSERT INTO `pos_positions_2016-10` (`pid`, `key`, `loc`, `day`, `pos`, `dif`)...

Дана символьная строка. Вывести на экран только те символы, которые встречаются в ней более трех раз, для каждого из эти
мне нужно срочно!!!! помоги чем сможете. С++ Добавлено через 19 секунд Вот задание Дана символьная строка. Вывести на экран только...

14
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
22.07.2015, 11:35
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Вопрос: Я хочу что это код выполнялось каждого дня только 1 раз
1) изменить запрос, чтобы не добавлялись данные , уже внесенные в Tab2 за этот день:
T-SQL
1
2
3
4
5
6
7
8
9
insert Tab2(mon, Tab1ID) -- output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*1 ,id
from Tab1
where not exists(
  select * 
  from Tab2 
  where Tab1.id=Tab2.Tab1ID 
    and cast(Tab2.dt as date)=cast(GETDATE() as date)
  )
2) включить запрос в расписание, или выполнять вручную - по желанию. Выполнять можно многократно - данные, уже рассчитанные за этот день, повторно добавлены не будут.
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603
22.07.2015, 12:31  [ТС]
cygapb-007 Огромное вам спасибо . Да все правильно работаеть
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
insert Tab2(mon, Tab1ID)  output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*1 ,id
from Tab1
where not exists(
  select * 
  from Tab2 
  where Tab1.id=Tab2.Tab1ID 
    and cast(Tab2.dt as date)=cast(GETDATE() as date)
  )
-------------------------------------------------------
select * , -- Суммировать оплачени проценти
           isnull((select SUM(mon) 
           from Tab2
           where Tab1.id=Tab2.Tab1ID
           ),0)[Proc]
from Tab1
Можно еще вопрос, пожалуйста . вот это код который вы написали
T-SQL
1
2
3
4
5
6
7
8
9
insert Tab2(mon, Tab1ID)  output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*1 ,id
from Tab1
where not exists(
  select * 
  from Tab2 
  where Tab1.id=Tab2.Tab1ID 
    and cast(Tab2.dt as date)=cast(GETDATE() as date)
  )
Я хочу что он рачал работу после 10 дней .......... Постараю сам , если не получится напишу ..... ОГРОМНОЕ СПАСИБО
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
22.07.2015, 12:39
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Я хочу что он рачал работу после 10 дней
от какой даты начинается отсчет 10 дней?
от сегодняшней календарной или от даты, указанной в Tab1?

Добавлено через 2 минуты
Кроме того, преобразование от DATETIME к DATE в дальнейшем замедлит обработку запросов
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603
22.07.2015, 12:44  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
от какой даты начинается отсчет 10 дней?
От Tab1-- dt после оформление потому что я заранее почиталь 10% и после 10-ого дня хочу прибавить его 1% -получается процент по дням

Добавлено через 2 минуты
Цитата Сообщение от cygapb-007 Посмотреть сообщение
Кроме того, преобразование от DATETIME к DATE в дальнейшем замедлит обработку запросов
да я выжу
T-SQL
1
cast(Tab2.dt as date)=cast(GETDATE() as date)
СПАСИБО
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
22.07.2015, 12:57
Цитата Сообщение от xxbesoxx Посмотреть сообщение
От Tab1-- dt
Тогда вам при добавлении в Tab1 нужно сразу одним запросом заполнить все требуемые даты в Tab2 - или до полного погашения суммы tab1.mon, или в каком-то диапазоне дат (например, от tab1.dt+10 до tab1.dt+60, или еще как-то). Подспорьем в этом запросе может служить таблица-календарь (или таблица целых чисел, не важно)

Добавлено через 3 минуты
При этом в Tab2 нужно предусмотреть механизм корректировки, типа План/Факт, с запретом корректировок подтвержденного факта

Добавлено через 2 минуты
или просто запретить редактировать все операции с датами раньше календарного сегодня
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603
22.07.2015, 13:04  [ТС]
cygapb-007 Вот приятно общаться с вами . Мне до вашего уровня, очень далеко.! Спасибо доброе человек ... Очень много мучался . Потом сказали на другом форуме что надо реализовать JOBS Реализация заданий читал-разбирал .https://msdn.microsoft.com/ru-... 05%29.aspx взрывается голова А то вы бистро дали хороши ответь.... ОГРОМНОЕ ВАМ СПАСИБО

Добавлено через 6 минут
Тогда вам при добавлении в Tab1 нужно сразу одним запросом заполнить все требуемые даты в Tab2
Да буду переделать это триггер
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TRIGGER  NachislINSERT
ON Tab1 FOR INSERT
AS
BEGIN
    ------ Читаем процент из выдано и сразу сохраняю в таблицу  Tab2
    insert Tab2  (Tab1ID, mon)
    select id, mon/100*10
    from Tab1
    where NOT EXISTS
                    (select Tab1ID, mon from Tab2  
                     where Tab1.id =Tab2.Tab1ID)
END
Цитата Сообщение от cygapb-007 Посмотреть сообщение
каком-то диапазоне дат (например, от tab1.dt+10 до tab1.dt+60, или еще как-то). Подспорьем в этом запросе может служить таблица-календарь (или таблица целых чисел, не важно)
Идея понятно, спасибо.
Цитата Сообщение от cygapb-007 Посмотреть сообщение
или просто запретить редактировать все операции с датами раньше календарного сегодня
Понял... попробую самому . Я думаю что получится . СПАСИБО ВАМ ОГРОМНОЕ
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
22.07.2015, 13:07
Цитата Сообщение от xxbesoxx Посмотреть сообщение
T-SQL
1
2
3
4
insert Tab2 (Tab1ID, mon) 
select id, mon/100*10 
from Tab1 
where ...
только не из Tab1, а из inserted
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603
22.07.2015, 13:10  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
только не из Tab1, а из inserted
Понял , спасибо
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603
14.08.2015, 13:14  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
или просто запретить редактировать все операции с датами раньше календарного сегодня
Еще раз спасибо. вот так работает правильно
T-SQL
1
2
3
4
5
6
7
8
9
insert Tab2(mon, Tab1ID)  output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*1 ,id
from Tab1 
where DATEDIFF(DAY, cast(Tab1.dt as date), cast(GETDATE() as date)) >9 --  Если после "Tab1.dt - дата оформления " прошло >9 дней 
and not exists( 
  select * 
  from Tab2 
  where Tab1.id=Tab2.Tab1ID 
  and cast(Tab2.dt as date)=cast(GETDATE() as date))
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
14.08.2015, 14:13
Цитата Сообщение от cygapb-007 Посмотреть сообщение
Кроме того, преобразование от DATETIME к DATE в дальнейшем замедлит обработку запросов
invm утверждал, что это преобразование не мешает использовать индекс по полю типа DATETIME.
На другом сайте он приводил убедительные доказательства этого.
Цитата Сообщение от xxbesoxx Посмотреть сообщение
вот так работает правильно
Да вот только DATEDIFF в WHERE полностью исключает возможность использовать индекс по Tab1.dt, если он есть конечно.
Надо писать SARGEable запросы, однако.
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603
14.08.2015, 14:55  [ТС]
Цитата Сообщение от iap Посмотреть сообщение
invm утверждал, что это преобразование не мешает использовать индекс по полю типа DATETIME.
Не понятно без реальный примеров . это все пустой разговор
Цитата Сообщение от iap Посмотреть сообщение
Да вот только DATEDIFF в WHERE полностью исключает возможность использовать индекс
Покажите где это написано
Цитата Сообщение от iap Посмотреть сообщение
Надо писать SARGEable запросы, однако.
Все отлично работает ! еще раз спасибо у cygapb-007
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
14.08.2015, 20:08
Лучший ответ Сообщение было отмечено Metall_Version как решение

Решение

T-SQL
1
2
where DATEDIFF(DAY, cast(Tab1.dt as date), cast(GETDATE() as date)) >9 
--  Если после "Tab1.dt - дата оформления " прошло >9 дней
речь идет об оптимизации работы с индексами. Если в фильтре используется функция от значения поля таблицы, оптимизатор запросов не сможет задействовать никакие индексы, и будет вынужден для фильтрации применить полное сканирование всех записей таблицы.

Если по полю Tab1.DT есть индекс, то фильтр, переписанный без использования функции, как предложено ниже, позволит оптимизатору задействовать этот индекс (значение поля для всех строк таблицы сравнивается с не завимой от значений любых полей этой таблицы величиной, то есть... ну, не константой вообще, но неизменным относительно этой таблицы на момент выполнения запроса значением)
T-SQL
1
2
where Tab1.dt<dateadd(day, -9, cast(GETDATE() as date)) 
--  Если после "Tab1.dt - дата оформления " прошло >9 дней
Другое дело, что при отсутствии индекса (или при использовании достаточно селективного индекса по другим полям) способ фильтрации практически не влияет на скорость обработки запроса.
1
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603
14.08.2015, 21:06  [ТС]
cygapb-007 Огромное вам человеческое спасибо , все понятно
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
insert Tab2(mon, Tab1ID)  output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*1 ,id
from Tab1 --1) where Если "Tab1.dt - дата оформления " прошло >9 дней 
where Tab1.dt<dateadd(day, -9, cast(GETDATE() as date))
and not exists( 
  select * 
  from Tab2 
  where Tab1.id=Tab2.Tab1ID 
  and cast(Tab2.dt as date)=cast(GETDATE() as date)) 
  -------------------------------------------------------
select * , -- Суммировать начислены проценты
           isnull((select SUM(mon) 
           from Tab2
           where Tab1.id=Tab2.Tab1ID
           ),0)[Proc]
from Tab1
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,603
26.10.2015, 18:29  [ТС]
Еще можно вопрос пожалуйста ... Если это INSERT после 9 дня, хочу что выполнялось каждого 10-ого дня только 1 раз . То есть, не каждого дня . А каждого 10 дня только 1 раз ... Как его переделать ?
T-SQL
1
2
3
4
5
6
7
8
9
10
11
insert Tab2(mon, Tab1ID)  output 'inserted.Tab2'[inserted.Tab2],inserted.*
select mon/100*10 , -- здесь хочу уже что 10 %
id
from Tab1
where not exists(
  select * 
  from Tab2 
  where Tab1.id=Tab2.Tab1ID 
    and cast(Tab2.dt as date)=cast(GETDATE() as date)
  -- и выполнялось каждого 10 дней только 1 раз 
  )
Чтобы делать каждого 10 дня, надо получить последняя дата начисления так
T-SQL
1
(select top 1 dt from Tab2 order by dt desc)-- и сравнить на этого если больше на 10 дней
Но как его реализовать ?

Добавлено через 22 часа 16 минут
Разобрал , тема можно закрыть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2015, 18:29
Помогаю со студенческими работами здесь

Выполнять скрипт раз в 5 минут
Всем привет! Вот у меня есть скрипт, который забирает файл с одного сайта и загружает его на другой. &lt;?php $my_tempalte_dir =...

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

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

Выполнять анимацию только при скролле
как написать на jquery чтобы у меня анимация выполнялась только при scroll. &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; ...

Выполнять действие только на определённом домене
Прошу помочь с простим решение на JS, по типу if($x == домен) { // работаем } else{}


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru