- 1
- 2
- 3
- 4
- 5
- 6
update People
set PeopleIsJunior='N'
where PeopleIsJunior='Y'
and month(BirthDay)=(select month(getdate()))
and year(BirthDay)=(select year(getdate())-18)
and day(BirthDay)=(select day(getdate()))
guest 06.01.2012 09:57 # 0
guest 06.01.2012 11:55 # 0
guest 06.01.2012 13:01 # 0
1. Добавляем дополнительное поле в таблицу MatureDate типа datetime, в которое уже при вставке записи в таблицу будет рассчитываться когда человеку исполнится 18 лет. Условие where будет выглядеть:
where PeopleIsJunior='Y' and MatureDate = getdate()
минусы - избыточность данных
2. Сравнивать разницу в днях и приблизительно считать, что кол-во дней до совершеннолетия 6574.
where PeopleIsJunior='Y' and cast(getdate()-BirthDay as int) = 6574
минусы - небольшая погрешность для тех, у кого високосных годов до совершеннолетия было не 4 :)
guest 06.01.2012 14:32 # 0
DECLARE @MatureBirthDate DATETIME
SET @MatureBirthDate = dateadd(yy,-18,getdate())
update People set PeopleIsJunior='N'
where PeopleIsJunior='Y' and BirthDay < @MatureBirthDate
bliznezz 10.01.2012 23:56 # 0
where BirthDay between @begin_datetime and @end_datetime
Тогда индексы и статистика раскрываются в полной мере.
ну или
where PeopleIsJunior='Y' and BirthDay < @end_datetime
шикарно и точнее сработает, подчистит если где-то что-то когда-то не отработало, но дорого. т.к. в этом случае придется прочитать слишком много строк данных, где вообще-то и так PeopleIsJunior='N'
DBdev 11.01.2012 19:24 # 0
На сколько я вижу, то в каждый момент выполнения скрипта нам нужно проставить признак совершеннолетия для людей соответствующих условиям:
1. Признак совершеннолетия не проставлен ранее;
2. 18 лет стукнуло человеку в промежуток времени от начала запуска предыдущего скрипта до начала запуска текущего скрипта.
Эти требования вполне покрываются условием:
where PeopleIsJunior='Y' and BirthDay <= @MatureBirthDate,
Кстати, на 99% уверен, что в базе вы храните в поле BirthDay только дату, а время там 00:00, что означает, что под условием подпадут все люди, у которых именно в этот день ДР и делать дополнительные хаки с добавлением времени 23:59 вовсе необязательно.
Далее.
Вешаются два индекса: первый на PeopleIsJunior (я бы перегнал его в тип bit, если кроме "Y"/"N" там ничего не хранится); второй на BirthDay.
Стоимость вставки данных в таблицу увеличится при массовых операциях ну на 5% не более. При выполнении скрипта UPDATE, оптимизатор запросов построит просто замечательный план с индекс сиками по 2 полям. Если я не прав - план запроса с костами в студию.
guest 06.01.2012 13:03 # +6
danilissimus 06.01.2012 17:49 # 0
rat4 06.01.2012 18:38 # +2
guest 06.01.2012 20:24 # +1
bugmenot 06.01.2012 20:29 # +5
чо-чо? откуда хайлатер знает такие слова? ай-ай-ай, страйко...
SmackMyBitchUp 06.01.2012 20:50 # +1
Lure Of Chaos 06.01.2012 23:10 # 0
demotivator 07.01.2012 02:27 # +1
guest8 09.04.2019 12:27 # −999