В целом ответ будет "Нет". Вы изменяете структуру таблицы, которая потенциально потребует большого количества обновлений", и я определенно соглашаюсь с этим. Если Вы будете ожидать делать это часто, то я предложу альтернативу "фиктивным" столбцам - использование VIEW
с вместо таблиц для SELECT
данные луга. IIRC, изменяя определение представления относительно легок, и косвенность посредством представления сделана, когда план запросов компилируется. Расход - то, что необходимо было бы добавить столбец к новой таблице и сделать представление JOIN
в столбце.
, Конечно, это только работает, если можно использовать внешние ключи для выполнения, расположение каскадом удаляет и этажерка. Другая премия - то, что можно составить новую таблицу, содержащую комбинацию данных, и указать на представление на него, не нарушая клиентское использование.
Просто мысль.
Попробуйте следующий запрос:
SELECT * FROM mytable
WHERE strftime('%m-%d', 'now') = strftime('%m-%d', birthday)
Наличие специального типа datetime всегда казалось мне ненужными накладными расходами, целые числа работают быстро, гибко и занимают меньше места.
Для общих значений datetime используйте временные метки Unix Epoch. Легко работать, чрезвычайно гибко, а также не зависит от часового пояса (и даже календаря!). (Недавно я написал статью об их использовании, которую мне действительно нужно вставить ... )
Тем не менее, если вас интересуют только даты в григорианском календаре, вы можете использовать большое целое число в следующем формате: ГГГГММДД, например, 19761203. Для вашего конкретного использования вы можете даже создать четырехзначное целое число, такое как MMDD, скажем 1703 - это должно приводить к быстрому выбору!
SQLite очень плохо поддерживает хранение дат. Вы можете использовать метод, предложенный Ником D выше, но имейте в виду, что этот запрос приведет к полному сканированию таблицы, поскольку даты неправильно индексируются в SQLite (на самом деле SQLite вообще не поддерживает даты как встроенный тип).
Если вы действительно хотите сделать быстрый запрос, вам придется добавить отдельный (интегральный) столбец для хранения дня рождения (1-31) и прикрепить для него индекс в базе данных.
Если вы только хотите для сравнения дат вы можете добавить один столбец (INTEGER), в котором будет храниться значение даты в формате UTC (но этот трюк не позволит вам легко искать отдельные компоненты даты).
Удачи