Если вы собираетесь преобразовать значения timestamp
поля в date
, как предлагается в другом ответе, производительность снизится, потому что каждое значение в столбце необходимо привести для сравнения, а простые индексы использовать нельзя,Вам необходимо создать специальный индекс для выражения , например, так:
CREATE INDEX some_idx ON tbl (cast(mdate AS date));
В этом случае запрос также должен быть упрощен до:
SELECT * FROM tbl WHERE mdate::date = '2011-09-12'::date; -- 2nd cast optional
Однако, насколько я понимаю, ваша проблема - это простая опечатка в вашем запросе:
Вы переключили верхнюю и нижнюю границы .Попробуйте:
SELECT * FROM tbl WHERE mdate <b>>=</b> '2011-09-<b>12</b> 00:00:00.0'
AND mdate <b><=</b> '2011-09-<b>13</b> 00:00:00.0';
Или, чтобы упростить синтаксис и быть более точным:
SELECT * FROM tbl WHERE mdate >= '2011-09-12 00:00'
AND mdate < '2011-09-13 00:00';
- Нет необходимости указывать секунды и дроби, которые равны 0.
Вы не хотите включать 2011-09-13 00:00
, поэтому используйте <
вместо <=
.
Не используйте BETWEEN
здесь, по той же причине:
<strike>WHERE mdate BETWEEN '2011-09-12 00:00' AND '2011-09-13 00:00'</strike>
Это будет включать 00:00 следующего дня.
Также имейте в виду, что столбец типа timestamp [without time zone]
интерпретируется в соответствии с текущим значением часового пояса.Часть даты зависит от этого параметра, который обычно должен работать как положено.Подробнее:
Игнорирование часовых поясов в Rails и PostgreSQL