2017-01-07 2 views
0

У меня есть следующие базы данныхПолучить записи между двумя датами с перекрытием временных интервалов

CREATE TABLE `table` (
`id` int(10) NOT NULL AUTO_INCREMENT, 
`time` bigint(20) DEFAULT NULL, 
`name` varchar(20) DEFAULT NULL, 
`messages` varchar(2000) NOT NULL, 
PRIMARY KEY (`id`) 
) 
INSERT INTO `table` VALUES (1,1467311473,"Jim", "Jim wants a book"), 
         (2,1467226792,"Tyler", "Tyler wants a book"), 
         (3,1467336672,"Phil", "Phil wants a book"); 

Мне нужно, чтобы получить записи между датой 29 июня 2016 и 1 июля 2016 для временных интервалов 18:59:52 до 01: 31:12. Я написал запрос, но он не возвращает желаемый результат

SELECT l.* 
FROM table l 
WHERE ((time >=1467226792) AND (CAST(FROM_UNIXTIME(time/1000) as time) >= '18:59:52') AND (CAST(FROM_UNIXTIME(time/1000) as time) <= '01:31:12') AND (time <=1467336672)) 

Любые предложения ??

+0

отливать свои временные метки DateTimes. –

+1

Я действительно смущен. Что такое '' emd_date'' и '' start_date''? Почему у вас есть строковые константы? Какие столбцы поступают из таблицы? Примерные данные и желаемые результаты помогут. –

+0

@GordonLinoff запрос не работает, если start_date = 21:30:00 и end_date is 03:30:00 – Unaffected

ответ

2

Как я понимаю, вы просто заинтересованы во все периоды больше, чем «2016-06-29 18:59:52» и меньше «2016-07 -01 1:31:12' , где время элемент нЕ между '01: 31: 12' и '18: 59: 52'

Я думаю, что вы можете превратить эту логику в SQL без дополнительной помощи

Ах, ну, вот скрипка - оставил весь материал from_unixtime(), потому что он добавляет ненужное усложнение для понимания проблемы - b ут адаптируя это решение ваших потребностей буквально только случай, предшествующий каждый экземпляр столбца time с этой функцией:

http://rextester.com/OOGWB23993

+0

Это дало бы все результаты между '2016-06-29 18:59:52 'и' 2016-07-01 01:31:12 ', т. е. результаты за 2016-06-30 за время больше 01:31:12 и меньше 18:59:52, что не требуется. Временной интервал для всех дней с 18:59:52 по 01:31:12 и исключить все остальные, которые не входят между этими временами – Unaffected

+0

Erm, может быть, перечитал мой ответ – Strawberry

+0

Да хорошо работает – Unaffected

0

Если я получил это право

SELECT l.* 
FROM `table` l 
WHERE time >=1467226792 
     AND time <=1467336672 
     AND CAST(FROM_UNIXTIME(time/1000) as time) >= '18:59:52' 
     AND FROM_UNIXTIME(time/1000) <= DATE_ADD(DATE_ADD(DATE_ADD(CAST(FROM_UNIXTIME(time/1000) as date), INTERVAL 25 HOUR), INTERVAL 31 MINUTE), INTERVAL 12 SECOND) 
+0

Кастинг/«время/1000» материал, безусловно, не нужен – Strawberry

+0

Кроме того, это решение (если оно правильно) усложняет проблему – Strawberry

Смежные вопросы