我目前有一个包含各种数据的时间戳表,以及一个需要根据给定时间戳't'返回prev时间戳的函数。
我在JDBC代码中的预准备语句中有以下查询:
String query = "SELECT LAG(?,1) OVER (ORDER BY TIME_STAMP DESC) FROM " + TABLE;
preparedStatement.setTimestamp(1, t);
结果集与我的参数的时间戳完全相同,并且我的数据库中有多少行。
如何返回PREVIOUS时间戳?
答案 0 :(得分:2)
如果您希望在给定时间戳之前获取最后一个时间戳,则以下仅使用MAX
的示例应该有效。它总是返回(仅)一行。
如果给定的时间戳是表中的最小时间戳,则它将返回NULL
。
如果表中不存在给定的时间戳,它将返回NULL
。
创建一个测试表:
CREATE TABLE TIME_STAMP_EVENT(
EVENT_ID NUMBER,
TIME_STAMP TIMESTAMP
);
填充它:
INSERT INTO TIME_STAMP_EVENT VALUES (1,TIMESTAMP '2017-01-01 00:00:00');
INSERT INTO TIME_STAMP_EVENT VALUES (2,TIMESTAMP '2017-02-01 00:00:00');
INSERT INTO TIME_STAMP_EVENT VALUES (3,TIMESTAMP '2017-03-01 00:00:00');
INSERT INTO TIME_STAMP_EVENT VALUES (4,TIMESTAMP '2017-04-01 00:00:00');
然后创建hibernate查询:
public Timestamp getPriorTimestamp(final Session session, final String testDateText) throws ParseException {
final SQLQuery theQuery = session.createSQLQuery(
"SELECT MAX(TIME_STAMP) FROM TIME_STAMP_EVENT WHERE TIME_STAMP < :theTimeStamp AND EXISTS (SELECT 1 FROM TIME_STAMP_EVENT SEMI_TIME WHERE SEMI_TIME.TIME_STAMP = :theTimeStamp)");
return (Timestamp) theQuery.setTimestamp("theTimeStamp",
(new SimpleDateFormat("dd-MMM-yyyy").parse(testDateText)))
.uniqueResult();
}
运行此操作时:myService.getPriorTimestamp("01-MAR-2017")
,它会返回2017年3月1日之前的最后一个时间戳,2017-02-01 00:00:00.0
但是如果针对不存在的记录myService.getPriorTimestamp("01-MAR-2017")
运行,则返回NULL
如果在表myService.getPriorTimestamp("01-JAN-2017")
中运行最小时间戳,则返回NULL