我有这些数据。
这是我的查询
SELECT transaction_date
FROM
tenant1.txn_transaction_record where '2015-04-14'
所述查询呈现空结果。是否可以仅使用日期查询时间戳字段?
答案 0 :(得分:4)
当你这样做时:
transaction_date = '2015-04-14'
PG会将字符串'2015-04-14'转换为时间戳'2015-04-14 00:00:00'值。
如果你这样做:
transaction_date::date = '2015-04-14'
PG会将这两个值转换为日期(只有日期部分,没有时间部分),它会起作用。
但是......在WHERE CLARUSE中生成列时要小心,因为PG无法利用包含该列的索引,除非您在列上创建了具有相同强制转换的索引。 强>
如果只创建此索引:
create index i_foo_1 on foo ( timestamp_field );
此查询不会使用该索引:
select *
from foo
where timestamp_field::date = '2015-04-15';
所以,或者你需要创建一个aditional索引:
create index i_foo_2 on foo ( timestamp_field::date );
或者您必须更改原来的“where子句”:
select *
from foo
where timestamp_field >= ('2015-04-15'::timestamp)
and timestamp_field < (('2015-04-15'::date)+1)::timestamp;
答案 1 :(得分: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'
答案 2 :(得分:1)
SELECT transaction_date
FROM
tenant1.txn_transaction_record where date_trunc('day', transaction_date) = '2015-04-14 00:00:00'
我没有postgres数据库可以尝试: - )