Выберите диапазон дат в столбце отметки времени - PullRequest
4 голосов
/ 14 сентября 2011

В настоящее время в моей таблице есть столбец для хранения даты и времени.Тип данных этого столбца: отметка времени без часового пояса .Таким образом, он имеет значения в формате '2011-09-13 11:03:44.537'.

. Мне нужно извлечь строки относительно даты.Если я использую:

select * from table where mdate >= '2011-09-13 11:03:44.537'
                      and mdate <= '2011-09-12 11:03:44.537'

, он предоставит значения, которые находятся между «2011-09-13 11: 03: 44.537» и «2011-09-12 11: 03: 44.537».

Но если я собираюсь с:

select * from table where mdate >= '2011-09-13 00:00:00.0'
                      and mdate <= '2011-09-12 00:00:00.0'

без даты, месяца и секунд, он не отображает никаких строк.

Как получить значения из этой таблицы относительнодата (только с датой, игнорируя часы, минуты и секунды)?

Даже в столбце есть дата с меткой времени, мне нужно искать их только с датой (игнорируя метку времени или делая часы, минуты и секунды0 например '2011-09-13 00:00:00.0').

Ответы [ 2 ]

5 голосов
/ 14 сентября 2011

Если вы собираетесь преобразовать значения 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

1 голос
/ 14 сентября 2011

Просто обработайте метку времени как дату:

select * 
from table 
where mdate::date >= DATE '2011-09-12' 
  and mdate::date <= DATE '2011-09-13'

Выражение mdate::date приведёт метку времени к типу date, который удалит часть времени из значения.

DATE '2011-09-13' - это (стандартный) литерал DATE, который немного более надежен, чем простое написание «2011-09-13», поскольку на него не влияют никакие языковые настройки.

...