2013-11-13 2 views
0

После того как я передать ETL в систему базы данных у меня есть измерение времени под названием «dim_time», таблица состоит из многих областях, как:запросов между датами на основе Concat год, месяц и день полей

- id 
- year 
- month 
- day 
- hour 
- week 
- day_of_week 

Я пытаюсь получить диапазон идентификаторов из этой таблицы, запрашивая его между 2 датами, после многих испытаний, я думал, что самый лучший вариант был concat поля и спросить <= и >=, это вопрос:

SELECT `DimTime`.`id` FROM `dim_time` AS `DimTime` 
    WHERE ((CONCAT(`DimTime`.`year`, "-", `DimTime`.`month`, "-", `DimTime`.`day`, " 00:00:00") >= CONCAT(2013, "-", 10, "-", 9, " 00:00:00")) 
    AND (CONCAT(`DimTime`.`year`, "-", `DimTime`.`month`, "-", `DimTime`.`day`, " 00:00:00") <= CONCAT(2013, "-", 11, "-", 13, " 00:00:00"))) 
    ORDER BY `DimTime`.`year` DESC, `DimTime`.`quarter` DESC, `DimTime`.`month` DESC, `DimTime`.`week` DESC, `DimTime`.`day` DESC, `DimTime`.`hour` DESC 

Этот запрос r eturns ids строк, которые являются днем ​​9 месяца 10, и все дни в месяце 11, день 1 до дня 13 (ограничение в запросе).

Почему остальные дни месяца 10 не являются результатом? Дни между 10 - 31.

Я не знаю, пропустил ли я что-то или если MySQL не может обработать concat как сравнение даты.

ответ

1

Это работает, когда у вас есть дата, как 2013-11-13, но вы должны бросить его на сегодняшний день, когда ваша сцепляются дата что-то вроде 2013-1-2, потому что действительная дата будет 2013-01-02.

В любом случае, лучше всего добавить столбец с полной датой в таблицу dim_time. Тем более, что даже если вы это заработаете, ваш запрос не сможет использовать индекс. Вам нужно будет написать это как

WHERE `DimTime`.`year` >= 2013 
AND `DimTime`.`month` >= 10 
... 

Тогда может использоваться индекс. Итак, сделайте вашу жизнь легкой, добавьте столбец полной даты в таблицу.

+0

Я думаю, что добавьте полную дату в таблицу, но руководитель разработчиков этого проекта, не хочу этого: S. То почему я теряю время с этим запросом ... Как я могу нарисовать concat к дате? Ok, STR_TO_DATE – ruudy

+1

Вы можете сделать это, выполнив 'CAST (CONCAT (...) AS DATE) AS column_name'. Было бы интересно, почему руководитель проекта этого не хочет. Я работаю уже несколько лет именно в этом бизнесе, работая на ETLs весь день, и я могу просто смотреть facepalm, услышав это. – fancyPants

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