За последние 24 часа нас посетили 17764 программиста и 1621 робот. Сейчас ищут 1815 программистов ...

Вытащить всё за год из БД

Тема в разделе "MySQL", создана пользователем NerdRage, 6 фев 2017.

  1. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Храню даты в UTC (datetime) с того момента как Медведев сменил нам часовой пояс на UTC+4. Но сейчас встал вопрос - как вытащить из таблицы все записи за определённый год?
    PHP:
    1. SELECT * FROM `stuff` WHERE YEAR(`date`)=2014
    Такая запись это естественно не правильно. Если в БД есть записи с датами типа:
    2013-12-31 23:35:22
    2015-01-01 01:35:22
    То после конвертации в локальное время, они попадают в 2014-й год. Как быть?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Делать выборку не по конвертированной дате, а по интервалу в unixstamp от "даты" до "даты". Они не подведут.
     
  3. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Это как? Даты хранятся не в unixstamp, а в datetime. Я там храню дни рождения, которые нельзя хранить в unixstamp, так что всё решил хранить в одном формате.

    З.Ы. Кстати перенесите тему в MySQL, я что-то не там создал.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ...в пост врывается timestamp и тут же уёбывает в неизвестном направлении...
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Кстати, я тут открыл доку и, в общем, суть в том, что datetime хранится как есть, без конвертации с учетом часовых поясов. Мб и нет никакой проблемы?
     
  6. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Я значения datetime генерирую в PHP функцией gmdate. Так что там точно UTC. Короче, пока придумал такой костыль:
    1. Вытащу все записи за 1 января следующего года и за 31 декабря прошлого года (в декабре же всегда 31 день?)
    2. Переведу дату каждого в локальное время средствами PHP, и если дата попала в нужный год - запишу id таких записей в переменную $add.
    3. Вытащу все записи за 1 января выбранного года и за 31 декабря выбранного года
    4. Переведу дату каждого в локальное время, и если дата НЕ попала в нужный год - запишу id таких записей в переменную $remove.
    5. Запрос составлю так:
    PHP:
    1. SELECT * FROM `stuff` WHERE (YEAR(`date`)=2014 OR `id` IN($add)) AND (`id` NOT IN($remove))
    --- Добавлено ---
    А вообще это ппц конечно, товарищи. На будущее - даты, которые не смотрят сегодня во вчерашний день, лучше хранить в timestamp? Пока не очень представляю как с ним работать.
     
    #6 NerdRage, 6 фев 2017
    Последнее редактирование: 6 фев 2017
  7. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
  8. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @NerdRage а что если юзать <2013 и >2015
     
  9. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Лоооооол. Timestamp не нужен, можно вот так сделать:
    PHP:
    1. SELECT COUNT(`id`) AS `numb` FROM `stuff` WHERE YEAR(DATE_ADD(`date`, INTERVAL 3 HOUR))=2015
    А смещение по UTC я могу получить в PHP так:
    PHP:
    1. $time_zone = new DateTimeZone('Europe/Moscow');
    2. $time_zone = (array)$time_zone;
    3. $time_zone = $time_zone['timezone_type']; // = 3
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    :D
    --- Добавлено ---
    *timestamp смотрит на твой костыль как на говно*
    --- Добавлено ---
    не забывать ставить галку "нулл" ;)
    в противном случае в отвественный момент выясняется что никакого таймштампа в комнате давно уже нет
    --- Добавлено ---
    хуйня вопрос, если тебе не лень гонять даты в инты и обратно каждый раз. Так что вобщем-то таймштамп опять смотрит на твой костыль как на говно.

    Таймштамп с галкой рулит!!!!!!!11стоодиннадцать
    Вива ла Таймштампа!!!1
     
  11. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Зато datetime читабельней. И проще напрямую в бд править. :p
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А тебе шашечки или ехать?
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    такой же абсолютно. только смещение автоматом учитывает.
     
  14. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Я получил и шашечки и ехать в итоге. И без всякой дурацкой автоматики.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    бог убил котёнка сейчас