LINUX.ORG.RU

[postgres] достать все записи за определённый месяц


0

0

Пытаюсь достать записи за опред. месяц. Самое красивое что получилось это вот так:

SELECT * from charges_charge where (extract year from date)=2009 and extract(month from date)=11;

Второй вариант:

SELECT * from charges_charge where text(date) like '2009-11%';
Третий вариант:
SELECT * from charges_charge where "date" between date('2009-11-01') and date('2009-11-01') + interval '1 month';
Чую, способы не самые оптимальные. Наверняка ведь можно сделать лучше. Как?

★★★★★

[code] select * from charges_charge cc where cc.date >= '2009-11-01' and cc.date < '2009-12-01'; [/code]

я б писал так, подавая сразу значения, которые нужно сравнивать и без конвертации строки в дату (хотя прибавить интервал - не большая потеря) - в целом аналогично твоему последнему варианту. первые два страдают лишними преобразованиями и операциями над каждой из выбираемых дат.

сам по себе запрос оптимальнее уже вряд ли можно сделать, ускорить его помогут грамотные индексы на таблицу. я в этом не силён, но думаю начать можно с:

[code] CREATE INDEX idx_cc_date ON charges_charge (date); [/code]

(если сменить индекс на unique index, возможно будет ещё лучше, но и тогда формат записи нужен timestamp, чтобы не было дупликатов. могу быть не прав, спецы поправят)

shuthdar ★★★
()

>Чую, способы не самые оптимальные. Наверняка ведь можно сделать лучше. Как?

Третий способ и есть самый оптимальный. Главное, как уже писали, не забыть сделать btree индексы по этому полю.

linuxfan
()

Ясно, спасибо. Я надеялся что есть функция какая-нить на эту тему, чтоб задал, скажем, where month(date)='2009-11' и она всё сделала.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от shuthdar

>но далеко не факт, что это будет оптимальнее, чем простой селект.

чем простой селект с индексами.

shuthdar ★★★
()
Ответ на: комментарий от shuthdar

оконные функции для других задач.

на счет вариантов - за вариант с like'ом ставят к стенке.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.