У меня есть ситуация, когда я хочу, чтобы пользователи могли указать временной диапазон, где время является относительным диапазоном, который существует на данной неделе. Таким образом, пользователь может выбрать понедельник 5 вечера - вторник 1 утра. Подумайте, что это похоже на "какое время - смена работы человека".
Моя первая реакция заключается в том, что я могу хранить "относительные" времена. Поэтому, предполагая, что неделя начнется в понедельник в 00:00:00, понедельник в полдень будет обозначаться как 86400/2 = 43200. Мне не очень нравится этот метод, потому что он затрудняет обработку часовых поясов.
Есть ли "лучший" способ сделать это (или просто хороший)? Есть ли у MySQL какой-то тип данных, который имеет дело с этим конкретно?
Я отметил эти "Perl" и "MySQL", так как я буду использовать их для этого приложения, но ответ не обязательно должен быть конкретным для любого из них технически.
Лучший ответ будет зависеть от того, что вы будете делать с данными вниз по течению.
Но я бы рекомендовал избегать любых хаков и делать простой подход (синтаксис таблицы Sybase, так как мой MySQL ржавый - извините)
CREATE TABLE weekday_ranges (
start_dow int, -- 0-6 or 1-7 depending on what easier downstream
start_hour int, -- 0-23
start_minute int, -- 0-59
-- Add seconds/micorseconds as needed
end_dow int,
end_hour int,
end_minute int
)
Альтернативный подход заключается в том, чтобы сохранить смещение (в секундах) с воскресенья 00:00, как начальное, так и конечное смещение. Это дает свои преимущества (например, сравнение диапазонов - это просто операторы <
и >
вместо сложных выражений).
Сохранение начального и конечного времени в одном поле (в отличие от разбитых на части) позволит проиндексировать поле. В противном случае нет большой разницы. (Это сводится к выбору того, собраны ли части в одно значение в Perl или SQL.)
Существует действительно неразрешимая проблема с часовым поясом: у вас нет возможности дифференцировать первые 2 часа со второго 2-х часов во время перехода из DST. Во входных данных просто недостаточно информации для обработки.
Monday 5PM - Tuesday 1AM
вUTC datetime range
при запросе?