4

我有一个带有“没有时区的时间戳”字段的 PostgreSQL 表。在某个给定点,我查询该表,并且我需要时间戳与执行查询在同一天的那些记录。这是代码:

 DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy/MM/dd HH:00:00");
 DateTime dt = new DateTime();
 String timeStampAsString = dt.toString(formatter);
 String select = "SELECT * FROM " + tableName + " WHERE " + tableName + ".timestamp >= '"+ timeStampAsString + "'";
 pst = dbConnection.prepareStatement(select);
 pst.execute();

如您所见,我在这里使用 Joda,我还在其他地方填充了该表,所以我现在的格式是正确的(yyyy/MM/dd HH:00:00)。不太确定我是否可以直接将 long 传递给查询而不是转换为 String,但这现在并不困扰我。

由于查询条件 >= 而不是“NOW”时间戳,因此它不太可能返回某些内容。我需要的是在“NOW”时间戳的同一天内获取记录。我想我必须要求上限和下限,但我不确定如何计算此查询的下限......有什么想法吗?

谢谢!

4

2 回答 2

10

我认为您需要此查询

select *
from test1
where ts >= current_date and ts < current_date + interval '1 day';

或者

select *
from test1
where ts >= now()::date and ts < now()::date + interval '1 day';

也可以这样做

select *
from test1
where ts::date = now()::date;

但我认为它会因为列中的数据转换而表现更差。

sql 小提琴演示

于 2013-08-16T09:26:44.963 回答
0

我会这样做

long t1 = System.currentTimeMillis() / (24 * 3600 * 1000) * (24 * 3600 * 1000);
long t2 = t1 + 24 * 3600 * 1000;
String select = "SELECT * FROM " + tableName + " WHERE timestamp >= ? and timestamp < ?";
pst = dbConnection.prepareStatement(select);
pst.setTimestamp(1, new Timestamp(t1));
pst.setTimestamp(2, new Timestamp(t2));
...
于 2013-08-16T09:42:06.540 回答