Лучше использовать два столбца или DATETIME - PullRequest
0 голосов
/ 19 апреля 2009

Я работаю над базой данных MySQL, которая создаст список «Today at» и отправит его подписчикам. Мне интересно, лучше ли использовать тип данных DATETIME в полях начала и конца, или два имеют два столбца, startDate и startTime (с соответствующими типами данных). Моей первой мыслью было использование DATETIME, но это делает последующее использование системы немного неловким, так как вы больше не можете писать:

SELECT * FROM event_list WHERE startAt='2009-04-20';

Вместо этого лучшее, что я нашел, было:

SELECT * FROM event_list WHERE startAt LIKE '2009-04-20%';

и мне не нравится взлом или его потенциальное влияние на производительность.

Ответы [ 6 ]

6 голосов
/ 19 апреля 2009

SELECT * FROM event_list ГДЕ startAt> = '2009-04-20' И startAt <'2009-04-21' </p>

Это будет эффективно использовать индекс startAt и правильно обрабатывать граничные условия. (Любое предложение WHERE, включая функцию, не сможет использовать индекс - он не может знать, что результат выражения имеет тот же порядок, что и значения столбца.

Использование двух столбцов немного похоже на наличие столбцов для целых и десятичных частей действительных чисел. Если вам не нужно время, просто не сохраняйте его.

6 голосов
/ 19 апреля 2009

Просто используйте функцию DATE().

SELECT * FROM event_list WHERE DATE(startAt) = '2009-04-20'
2 голосов
/ 20 апреля 2009

Реальное значение между отдельными полями даты и времени или 1 полем даты и времени заключается в индексации. Вы не хотите делать это: выберите * из списка событий, где дата (startAt) = '2009-04-20' в поле даты и времени, потому что он не будет использовать индекс. MySQL преобразует данные startAt в дату, чтобы сравнить их, что означает, что он не может использовать индекс. Вы хотите сделать это: выберите * из списка событий, где startAt МЕЖДУ '2009-04-20 00:00:00' И '2009-04-20 23: 59: 59'

Проблема с полем datetime заключается в том, что вы не можете использовать его составным индексом, так как значение довольно уникально. Например, составной индекс по событию startAt + не позволит вам выполнять поиск по дате + событию, а только по дате + событию. Но если вы разделите данные между полями даты и времени, вы можете индексировать событие startDate + и эффективно выполнять поиск по нему.

Это просто пример для обсуждения, вы могли бы явно указывать на событие + startAt, и это сработало бы. Но вы можете захотеть искать / суммировать на основе даты плюс другое поле. Создание составного индекса для этих данных сделает его очень эффективным.

2 голосов
/ 19 апреля 2009

Как насчет лучшего из обоих миров - иметь таблицу, в которой используется один столбец даты и времени, и представление этой таблицы, в котором отображаются поля даты и времени.

create view vw_event_list
   as select ..., date(startAt) as startDate, time(startAt) as startTime

select * from vw_event_list where startDate = '2009-04-20'
2 голосов
/ 19 апреля 2009

вы можете попробовать smf вот так

select * from event_list where date(startAt) = '2009-04-20
0 голосов
/ 20 апреля 2009

Еще одна вещь, которую нужно добавить: Остерегайтесь часовых поясов, если вы предлагаете онлайн-сервис, он рано или поздно появится, и это действительно сложно сделать задним числом.

Летнее время особенно плохо.

(DAMHIK)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...