2015-04-16 2 views
2

У меня есть эти данные.Postgresql запрос данных с меткой времени только с датой

enter image description here

это мой запрос

SELECT transaction_date 
FROM 
tenant1.txn_transaction_record where '2015-04-14' 

Указанный запрос предоставляет пустой результат. Возможно ли запрашивать поле метки времени с использованием только даты?

ответ

3

When вы делаете:

transaction_date = '2015-04-14' 

PG преобразует строку '2015-04-14' в значение timestamp '2015-04-14 00:00:00'.

Если вы:

transaction_date::date = '2015-04-14' 

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

BUT ... БУДЬТЕ ОСТОРОЖНЫ, КОГДА ОЖИДАЮТ КОЛОНКИ В КЛАССЕ, потому что PG не сможет воспользоваться индексом, содержащим этот столбец, если только вы не создали индекс с тем же литом в столбце.

Если вы создаете только этот показатель:

create index i_foo_1 on foo (timestamp_field); 

Этот запрос не будет использовать этот индекс:

select * 
from foo 
where timestamp_field::date = '2015-04-15'; 

Так или вам необходимо создать индекс: фильм

create index i_foo_2 on foo (timestamp_field::date); 

Или вам придется изменить оригинал «где предложение»:

select * 
from foo 
where timestamp_field >= ('2015-04-15'::timestamp) 
and timestamp_field < (('2015-04-15'::date)+1)::timestamp; 
3

Нет, если вы действительно любите transaction_date = '2015-04-14' Он будет автоматически искать transaction_date = '2015-04-14T00:00:00'. Таким образом, вы не получите никакого результата. Поэтому, если вы хотите найти дату попробовать transaction_date::date = '2015-04-14'
Таким образом, окончательный запрос есть,

SELECT transaction_date 
FROM 
tenant1.txn_transaction_record where transaction_date::date = '2015-04-14' 
+0

Оффтопик: будьте осторожны при размещении столбцов в разделе «где». В большинстве случаев он не будет использовать какой-либо индекс (если вы не создали индекс с этим столбцом) – Christian

1
SELECT transaction_date 
FROM 
tenant1.txn_transaction_record where date_trunc('day', transaction_date) = '2015-04-14 00:00:00' 

у меня нет базы данных Postgres, чтобы попробовать его :-)

Смежные вопросы