Я хочу хранить в БД START time и END time. Важны только hours и minutes, поэтому в форме у пользователя есть 4 выпадающих списка (start_time_hours, start_time_minutes, end_time_hours, end_time_minutes).
Значения для часов - [00-23], для минут - [00, 15, 30, 45]. В конце я хотел бы иметь вычитание из обоих в десятичном виде.
Мне интересно лучше хранить 2 поля TIME (для времени начала и окончания) или 2 поля DECIMAL?
В этом случае минуты можно плавно преобразовать в десятичные числа: [00 => 00, 15 => 0,25, 30 => 0,5, 45 => 0,75], поэтому время 19:15 получится как 19:25. Я думаю, что с точки зрения хранения БД это то же самое, поскольку TIME и DECIMAL (4,2) занимают 3 байта, если я не ошибаюсь :)
Так, например, после сохранения данных в БД я возвращаюсь к редактированию формы и ожидаю, что сохраненные значения будут в этих 4 раскрывающихся списках. Если бы данные БД были типа TIME, я должен использовать что-то вроде
$hours = date('G', strtotime($start_time))&&$minutes = date('i', strtotime($start_time))
для раскрывающихся списков времени НАЧАЛА, но если данные будут ДЕСЯТИЧНЫМИ, то
$hours = floor($start_time);&&$minutes = $start_time - $hours;
Какой из этих двух способов будет быстрее?
Это могут быть какие-то другие вычисления между этими двумя временами, поэтому я предполагаю, что для всех данных типа TIME это будет включать функции date() или (и) strtotime(), но для типа DECIMAL только математические функции?
Итак, какое решение лучше всего подходит для скорости и БД? Может быть, есть еще лучшее решение для этого случая?
Я предполагаю, что одним недостатком DECIMAL является масштабируемость в будущем, например, если мы решим позволить пользователю выбирать минуты от 1 до 60, - тогда мы не сможем получить точное значение DECIMAL для 18:10, так как это будет 18.16666...
если вас беспокоят преобразования минут в проценты с потерей точности и возможностью давать неверный результат, используйте десятичную дробь. Если вы предпочитаете более легкие времена обработки, пойдите на время. третий вариант может состоять в том, чтобы хранить только минуты. 630 в примере 10:30. (минут / 60) часов (минут % 60) минут
MySQL позволяет вычитать время. Почему тогда вы хотите сохранить его как десятичное число?
@TimBiegeleisen Я понимаю, и это хороший момент, но в этом случае требуется, чтобы это не было между двумя датами.
@Cid Ty, этот третий вариант сохраняет 1 байт в БД (при использовании smallint), но также может добавить дополнительные вычисления, например, на этапе редактирования формы для раскрывающихся списков это должно быть $hours = floor($start_time/60) ; && $минуты = $start_time - $часы; (1 дополнительный дивизион :) )
@SalmanA Вот что я хочу выяснить, что будет лучше. Разве дата MySQL (а также дата PHP) не работают/манипуляции медленнее, чем числовые манипуляции?
@Gaccho Я бы не стал беспокоиться о замедлении, если данные хранятся так, как должны быть. Кроме того, хранение данных в неправильном типе данных может привести к замедлению.






Я рекомендую тип TIME. Тип времени имеет большее значение. Возможно, десятичный тип иногда немного быстрее, чем тип TIME. Но когда вы используете десятичную дробь, вы должны убедиться, что все вычисляют правильно везде, а не только в вашем коде. Я думаю, что это важнее, чем размер и скорость.
Я сомневаюсь, действительно ли хранения времени достаточно для того, что вы пытаетесь сделать. Например, есть ли шанс, что какое-то событие может начаться, скажем, в 23:00, а затем продолжиться до следующего дня? Если это так, то вам было бы гораздо лучше просто хранить полные даты.