Как выбрать записи за последние 24 часа, используя SQL?


185

Я ищу whereпункт, который можно использовать для получения записей за последние 24 часа?


1
У вас есть поле метки времени на этих записях?
Шон Стюард

Ответы:


101
SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)

6
Если записи хранятся как DATETIME, будут выбраны все записи за предыдущую дату, независимо от временной части. Запущенный в 23:59:59, запрос вернет все записи за последние 48часы, а не 24.
Quassnoi

18
Если вы хотите выбрать последние 24 часа из поля даты и времени, замените curate () на now (). Это также включает время.
Haentz

564

В MySQL:

SELECT  *
FROM    mytable
WHERE   record_date >= NOW() - INTERVAL 1 DAY

В SQL Server:

SELECT  *
FROM    mytable
WHERE   record_date >= DATEADD(day, -1, GETDATE())

В Oracle:

SELECT  *
FROM    mytable
WHERE   record_date >= SYSDATE - 1

В PostgreSQL:

SELECT  *
FROM    mytable
WHERE   record_date >= NOW() - '1 day'::INTERVAL

В Redshift:

SELECT  *
FROM    mytable
WHERE   record_date >= GETDATE() - '1 day'::INTERVAL

В SQLite:

SELECT  *
FROM    mytable
WHERE   record_date >= datetime('now','-1 day')

В MS Access:

SELECT  *
FROM    mytable
WHERE   record_date >= (Now - 1)

3
Я пытаюсь запрос для MySQL, но если его 2 утра, например, я получаю записи с 00 до 02 часов утра. Только два часа вместо 24. Есть идеи?
Манос

Мне очень нравится решение, представленное здесь, но в MySQL я заметил, что производительность решения Гийома Фландра была выше.
oneworld

1
В Amazon Redshift я получаю function getdate() does not exist. Заменил его на current_dateи он работал нормально.
FloatingRock

1
Этот ответ заставляет меня желать, чтобы была кнопка «звездочка», поскольку я хочу добавить это в закладки.
Брайан Риск

1
@Manos В MySQL, похоже CURDATE(), не возвращает дату с частью времени, поэтому она идет 00. Я исправил это, используя NOW()вместо CURDATE().
4каст

21

MySQL:

SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(NOW(), INTERVAL 24 HOUR)

ИНТЕРВАЛ может быть в ГОД, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, ВТОРОЙ

Например, за последние 10 минут

SELECT * 
FROM table_name
WHERE table_name.the_date > DATE_SUB(NOW(), INTERVAL 10 MINUTE)

3
Это ответ, который лучше всего отвечает на конкретный вопрос: как вернуть PRECEDING 24 ЧАСА (с настоящего момента), в отличие от предыдущих 24 (который предлагает все результаты за предыдущий день). Это отвечает моим требованиям, это получает мой upvote. РЕДАКТИРОВАТЬ: стоит упомянуть столбец table_name.the_date должна быть метка времени.
Энтони Креган

8

Какой SQL не был указан, SQL 2005/2008

SELECT yourfields from yourTable WHERE yourfieldWithDate > dateadd(dd,-1,getdate())

Если вы используете типы дат с повышенной точностью 2008 года, используйте вместо этого новую функцию sysdatetime (), равно как и при использовании внутреннего времени UTC для внутреннего вызова вызовов UTC.


7

в postgres, предполагая, что ваш тип поля является временной меткой:

выберите * из таблицы, где поле date_field> (now () - интервал '24 часа ');


4

Если рассматриваемая временная метка является временной меткой UNIX Вам необходимо сначала преобразовать временную метку UNIX (например, 1462567865) в метку времени mysql или данные.

SELECT * FROM `orders` WHERE FROM_UNIXTIME(order_ts) > DATE_SUB(CURDATE(), INTERVAL 1 DAY)

Предполагается, что используемый движок - MySQL, поскольку FROM_UNIXTIME () - это функция MySQL. Для SQL Server используйте: SELECT DATEDIFF(s, '1970-01-01 00:00:00', DateField) Если вам нужна точность в миллисекундах в SQL Server 2016 и более поздних версиях, используйте: SELECT DATEDIFF_BIG(millisecond, '1970-01-01 00:00:00', DateField)
luisdev


2

Здравствуйте, сейчас прошло много времени с оригинального поста, но у меня возникла похожая проблема, и я хочу поделиться.

Я получил поле даты и времени с этим форматом ГГГГ-ММ-ДД чч: мм: сс, и я хочу получить доступ к нему целый день, так что вот мое решение.

Функция DATE () в MySQL: извлечение части даты из выражения даты или даты и времени.

SELECT * FROM `your_table` WHERE DATE(`your_datatime_field`)='2017-10-09'

с этим я получаю весь регистр строк в этот день.

Я надеюсь, что это поможет любому.


Это единственный, который работал для меня на MySQL. По какой-то причине, когда я пытался выбрать SELECT * FROM myTable WHERE myDate> DATE_SUB ('2018-06-13 00:00:00', INTERVAL 24 HOUR); Я все еще получал записи с 2018-06-14.
jDub9


1

В SQL Server (за последние 24 часа):

SELECT  *
FROM    mytable
WHERE   order_date > DateAdd(DAY, -1, GETDATE()) and order_date<=GETDATE()

2
зачем вам нужно добавлять «and order_date <= GETDATE ()», когда вы уже ищете последние 24 часа с момента выполнения этого запроса? На самом деле нет смысла включать эту часть в предложение where, когда вы уже упоминали «GETDATE» в первом. Вам лучше сделать это "order_date> = DateAdd (DAY, -1, GETDATE ())" вот и все!
KMX
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.