Выбрать из таблицы данные за последние 6 часов

Тема в разделе "Базы данных", создана пользователем verfaa, 4 дек 2012.

Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    В БД MySQL есть таблица в которой есть поле date_creation, в котором содержится дата формата datetime, т.е. в ней хранятся данные вида 2012-07-18 07:30:26.

    Как выбрать данные из таблицы, которые были добавлены за последние 6 часов?
    За последние 24 часа?
     
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    а так получится?
    SELECT * FROM `таблица`
    WHERE HOUR(TIMEDIFF(now(), `date_creation`)) <= количество часов
     
    vhome нравится это.
  3. Leony

    Leony

    Регистр.:
    18 мар 2008
    Сообщения:
    153
    Симпатии:
    25
    SELECT * FROM Таблица WHERE UNIX_TIMESTAMP (date_creation) > UNIX_TIMESTAMP ('2012-12-03 17:11:25'), т.е. всё, что позже 2012-12-03 17:11:25
    ORDER BY и LIMIT – по вкусу
     
  4. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Leony мне нужно не записи, которые старше определенной даты, а выбрать записи которые были добавлены за последние 6 часов.
    ipbfan2008, а что в переменной date_entered храниться?
    Вообщем, вопрос пока открыт...
     
  5. Leony

    Leony

    Регистр.:
    18 мар 2008
    Сообщения:
    153
    Симпатии:
    25
    Я имел ввиду отнять кол-во часов и ввести эту дату. В принципе согласен, неудобно.

    SELECT * FROM Таблица WHERE TIMEDIFF(SYSDATE(),date_creation)<7
    Для 24 часов – то же, чтолько "<25" в конце
     
    vhome нравится это.
  6. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    это не переменная, а название поля date_entered
    извини, ошибся в названии поля, но там не составляго большого труда понять и поменять, сравнивается значения для каждой записи и выборка должна возвращать только записи у которых дата не больше чем разница часов в условии, относительно now(). поправил свой пост, чтоб не конфузить
     
  7. ptuchster

    ptuchster Создатель

    Регистр.:
    21 ноя 2007
    Сообщения:
    41
    Симпатии:
    28
    А это не одно и тоже вы чейчас говорите батенька ?

    select * from table where date > date_sub(now(), interval 6 hour)

    Вот вам еще способ. Я на сколько понимаю поле date_creation - это и есть поле даты создания. Чтобы выбрать записи "созданные за последние 6 часов" это равносильно "выбрать записи, дата создания которых больше чем (дата - 6 часов)". Это логика. Если вы используете поле date_creation как date_updated, тоесть записываете туда новую дату при прикосновении к строке- то уже никак не выбрать. Если только конечно у вас не установленны тригеры на какие либо действия.
     
  8. Andry750

    Andry750 Создатель

    Регистр.:
    28 ноя 2012
    Сообщения:
    10
    Симпатии:
    0
    Подскажите, а как тоже самое только для SQL сделать? ... говорит что "date_sub не является распознанным именем встроенной функции":nezn:
     
  9. ptuchster

    ptuchster Создатель

    Регистр.:
    21 ноя 2007
    Сообщения:
    41
    Симпатии:
    28
    Ну тут зависит от того какую БД ты используешь. Вообще, это все очень легко гуглится на тему 'mysql DATE_SUB in postrees' Тут же приведу пример из первой же ссылки по разнице:

    PostgreSQL​
    MySQL​
    datefield + 6 DATE_ADD(datefield, INTERVAL 6 DAY)
    datefield + INTERVAL '6 months' DATE_ADD(datefield, INTERVAL 6 MONTH)
    datefield - INTERVAL '6 months' DATE_SUB(datefield, INTERVAL 6 MONTH)


    Последняя строка- то что надо. Всегда надо понимать что синтаксис БД всегда немного разный. Поэтому надо просто с этим столкнуться. Я вот до недавнего времени не знал что PGSQL имеет чувствительность к регистру и where a = b приходилось переписывать на where lower(a) = lower(b)
     
    vhome нравится это.
  10. shadrag

    shadrag Писатель

    Регистр.:
    22 окт 2012
    Сообщения:
    1
    Симпатии:
    0
    MSSQL: select * from table where date > DATEADD(hh,6,now())