У меня интересный случай. У меня есть набор дат и мне нужно найти минимум для каждого дня. База данных хранит их как UTC, но их необходимо сгруппировать в соответствии с (1) местным часовым поясом и (2) пользовательским полем «мой день начинается в XX: XX».
Например, если мой набор данных следующий:
+----------+---------------------+
| id | start |
+----------+---------------------+
| 1 | 2015-04-26 16:00:00 |
+----------+---------------------+
| 2 | 2015-04-26 17:00:00 |
+----------+---------------------+
| 3 | 2015-04-26 20:00:00 |
+----------+---------------------+
| 4 | 2015-04-27 01:00:00 |
+----------+---------------------+
| 5 | 2015-04-27 16:25:00 |
+----------+---------------------+
| 6 | 2015-04-27 16:35:00 |
+----------+---------------------+
| 7 | 2015-04-28 02:00:00 |
+----------+---------------------+
И если человек, который запрашивает, находится в Нью-Йорке (UTC + 4) и говорит, что его день начинается в «3:30 утра» (UTC + 4 + 3: 30), то мне потребуются следующие результаты:
+----------+---------------------+
| id | start |
+----------+---------------------+
| 2 | 2015-04-26 17:00:00 |
+----------+---------------------+
| 6 | 2015-04-27 16:35:00 |
+----------+---------------------+
Обратите внимание, что время указано для UTC для «первых» записей дня, которые начинаются «в 3:30 утра по Нью-Йорку или после него».
В настоящее время мой запрос выглядит примерно так:
SELECT * FROM records GROUP BY DATE(start);
я делать использовать PHP, так что это так же просто, как вычисление дельты времени (например: UTC + 4 + 3: 30 => +7,5 часов ИЛИ ЖЕ +450 минут) и используя DATE_ADD()
?
Это правильный / лучший способ сделать это?
SELECT * FROM records GROUP BY DATE(DATE_ADD(start,INTERVAL 450 MINUTE));
Задача ещё не решена.
Других решений пока нет …