Храню даты в UTC (datetime) с того момента как Медведев сменил нам часовой пояс на UTC+4. Но сейчас встал вопрос - как вытащить из таблицы все записи за определённый год? PHP: SELECT * FROM `stuff` WHERE YEAR(`date`)=2014 Такая запись это естественно не правильно. Если в БД есть записи с датами типа: 2013-12-31 23:35:22 2015-01-01 01:35:22 То после конвертации в локальное время, они попадают в 2014-й год. Как быть?
Делать выборку не по конвертированной дате, а по интервалу в unixstamp от "даты" до "даты". Они не подведут.
Это как? Даты хранятся не в unixstamp, а в datetime. Я там храню дни рождения, которые нельзя хранить в unixstamp, так что всё решил хранить в одном формате. З.Ы. Кстати перенесите тему в MySQL, я что-то не там создал.
Кстати, я тут открыл доку и, в общем, суть в том, что datetime хранится как есть, без конвертации с учетом часовых поясов. Мб и нет никакой проблемы?
Я значения datetime генерирую в PHP функцией gmdate. Так что там точно UTC. Короче, пока придумал такой костыль: Вытащу все записи за 1 января следующего года и за 31 декабря прошлого года (в декабре же всегда 31 день?) Переведу дату каждого в локальное время средствами PHP, и если дата попала в нужный год - запишу id таких записей в переменную $add. Вытащу все записи за 1 января выбранного года и за 31 декабря выбранного года Переведу дату каждого в локальное время, и если дата НЕ попала в нужный год - запишу id таких записей в переменную $remove. Запрос составлю так: PHP: SELECT * FROM `stuff` WHERE (YEAR(`date`)=2014 OR `id` IN($add)) AND (`id` NOT IN($remove)) --- Добавлено --- А вообще это ппц конечно, товарищи. На будущее - даты, которые не смотрят сегодня во вчерашний день, лучше хранить в timestamp? Пока не очень представляю как с ним работать.
Лоооооол. Timestamp не нужен, можно вот так сделать: PHP: SELECT COUNT(`id`) AS `numb` FROM `stuff` WHERE YEAR(DATE_ADD(`date`, INTERVAL 3 HOUR))=2015 А смещение по UTC я могу получить в PHP так: PHP: $time_zone = new DateTimeZone('Europe/Moscow'); $time_zone = (array)$time_zone; $time_zone = $time_zone['timezone_type']; // = 3
--- Добавлено --- *timestamp смотрит на твой костыль как на говно* --- Добавлено --- не забывать ставить галку "нулл" в противном случае в отвественный момент выясняется что никакого таймштампа в комнате давно уже нет --- Добавлено --- хуйня вопрос, если тебе не лень гонять даты в инты и обратно каждый раз. Так что вобщем-то таймштамп опять смотрит на твой костыль как на говно. Таймштамп с галкой рулит!!!!!!!11стоодиннадцать Вива ла Таймштампа!!!1