Большая часть того, что я должен был сказать, уже было сказано: используйте тип DATE для хранения даты и убедитесь, что она проиндексирована.Если вы собираетесь использовать три целых числа для хранения даты и поиска по ней, убедитесь, что они также проиндексированы:
CREATE INDEX IX_MyTable_Date_Ints ON MyTable(intYear, intMonth, intDay)
CREATE INDEX IX_MyTable_Date ON MyTable(BirthDate)
Если вы хотите иметь возможность поиска вПользовательская таблица для дней рождения, исключая год, я бы рекомендовал хранить день рождения в другом поле даты, используя фиксированный год, например, 3004 - вместо трех целых чисел.Ваш базовый год должен быть високосным, чтобы удовлетворить любого, кто, возможно, родился 29 февраля.Если вы используете год в далеком будущем, вы можете использовать год, чтобы определить, что дата фактически является датой, для которой год следует игнорировать.
Затем вы можете искать день рождения независимо от года.без необходимости вызывать функцию для каждой записи, добавив "WHERE birth_day = '3004-12-10'. Если это поле проиндексировано, вы должны иметь возможность вернуть все совпадающие строки во флэш-памяти.Имейте в виду, что при поиске в индексе серверу нужно будет выполнить не более 32 сравнений, чтобы найти совпадение в записях из 4 млрд. Никогда не стоит недооценивать преимущества индексирования!триггер, чтобы он постоянно обновлялся. Для тех дат рождения, где у вас нет года, просто используйте свой базовый год (3004.) Поскольку ваш базовый год находится в будущем, вы знаете, что эта дата рождения неиметь год.
CREATE TABLE MyTable (
MyTable_key INT IDENTITY(1, 1),
username VARCHAR(30),
birth_date DATE,
birth_day DATE
)
ALTER TABLE MyTable ADD CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED (MyTable_key)
CREATE INDEX MyTable_birth_date ON MyTable(birth_date)
CREATE INDEX MyTable_birth_day ON MyTable(birth_day)
GO
CREATE TRIGGER tr_MyTable_calc_birth_day ON MyTable AFTER INSERT, UPDATE AS
UPDATE t SET birth_day = DATEADD(YEAR, 3004-DATEPART(YEAR, t.birth_date), t.birth_date)
FROM MyTable t, inserted i WHERE i.MyTable_key = t.MyTable_key
Чтобы обновить существующую таблицу, запустите обновление как отдельный запрос, без объединения с модулями.Таблица ошибок, как она использовалась в триггере:
UPDATE MyTable SET birth_day = DATEADD(YEAR, 3004-DATEPART(YEAR, birth_date), birth_date)
Надеюсь, это поможет.