Как мне сопоставить целый день с полем datetime? - PullRequest
1 голос
/ 12 января 2012

У меня есть таблица для матчей.В таблице есть столбец с именем matchdate, который является полем datetime.

Если у меня 3 совпадения на 2011-12-01:

  • 2011-12-01 12: 00: 00
  • 2011-12-01 13: 25: 00
  • 2011-12-01 16: 00: 00

Как мне это сделать?Как запросить все совпадения за одну дату?

Я смотрел на date_trunc(), to_char() и т. Д.
Нет ли какой-нибудь "select * where datetime in date" функции?

Ответы [ 3 ]

5 голосов
/ 12 января 2012

Приведите значение timestamp к date, если вы хотите простой синтаксис.Например:

SELECT *
FROM   tbl
WHERE  timestamp_col::date = '2011-12-01';  -- date literal

Однако с большими таблицами это будет быстрее:

SELECT *
FROM   tbl
WHERE  timestamp_col >= '2011-12-01 0:0'    -- timestamp literal
AND    timestamp_col <  '2011-12-02 0:0';

Причина: второй запрос не должен преобразовывать каждое значение в таблице и может использоватьпростой индекс в столбце метки времени.Выражение sargable .

Примечание исключает верхнюю границу (< вместо <=) для правильного выбора.
Вы можете восполнить это, создав индекс для выражения , например, так:

CREATE INDEX tbl_ts_date_idx ON tbl (cast(timestamp_col AS date));

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

1 голос
/ 12 января 2012

не уверен, что я что-то упускаю здесь очевидное, но я думаю, что вы можете просто

select * from table where date_trunc('day', ts) = '2011-12-01';
0 голосов
/ 12 января 2012

Просто используйте функцию SQL МЕЖДУ, например:

SELECT * FROM table WHERE date BETWEEN '2011-12-01' AND '2011-12-02'

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

С рельсов я верю, что вы можете сделать:

.where(:between => '2011-12-01'..'2011-12-02')
...