2015-01-12 3 views
2

У меня есть таблица вроде этого:Смешайте две колонки «между» п

Table

Я хочу, чтобы получить данные от декабря 2014 года - февраль 2015 года, который я должен использовать 2 колонки внутри между пунктом: between (month = 12 and year = 2014) and (month = 1 and year = 2015)

Я думаю, что это невозможно. Есть ли другой способ сделать это? На самом деле нужно ваше предложение.

+0

Postgres позволит 'где (год, месяц) между (2014,12) и (2015,2),' возможно MySQL делает, Что ж. –

ответ

0

Попробуйте это:

select * from `table` where (month =12 and year=2014) or (month in (1,2) and year =2015) 
0

Как об этом:

Year*12+Month BETWEEN @StartYear*[email protected] and @EndYear*[email protected] 

Кончиками valuews, это было бы:

Year*12+Month BETWEEN 2014*12+12 and 2015*12+1 

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

+0

Это приведет к полному сканированию таблицы, поскольку база данных должна будет вычислять дату каждой строки, что приводит к ужасной производительности даже для небольших таблиц. Даже редактирование неверно, например, представьте себе сравнение 11/15 - 1/15 –

+0

Да, я заметил ошибку редактирования сейчас и удалил ее. Что касается проблемы с производительностью, я знаю об этом, поэтому я добавил обновление, и теперь, когда есть много хороших решений, предположил, что один из них может работать. – Beartums

+0

Кроме того, если вы хотите сгенерировать значение даты, просто сгенерируйте значение даты с помощью 'MAKEDATE'. Результат будет намного легче понять –

4

Мой совет - фактически изменить таблицу, чтобы использовать реальные даты, если это возможно. Если они неполные даты, вы можете заставить их быть в начале периода, например yyyy-mm-01.

Затем вы можете легко использовать between в своих запросах вместе со всеми видами чудесных функций манипулирования датами.

Однако, если это не вариант, а ваши данные правильно в том смысле, что существует только достоверные данные в таблице, вы можете просто использовать что-то вроде:

select * from mytable 
where (year = 2014 and month >= 12) 
    or (year = 2015 and month <= 2) 

Это может быть обобщена в запрос на сегодняшний день между M1/​​Y1 и M2/Y2 включительно, с чем-то вроде:

select * from mytable 
where (year = Y1 and month >= M1) 
    or (year > Y1 and year < Y2) 
    or (year = Y2 and month <= M2) 
Смежные вопросы