[英]JDBC PL/SQL Previous Row (LAG) only returning current value
我目前有一张包含各种数据的时间戳表,以及一个需要根据给定的时间戳“ t”返回上一个时间戳的函数。
我的JDBC代码中的预备语句中有以下查询:
String query = "SELECT LAG(?,1) OVER (ORDER BY TIME_STAMP DESC) FROM " + TABLE;
preparedStatement.setTimestamp(1, t);
结果集与参数的时间戳完全相同,数据库中的行数与之相同。
我该怎么做才能返回上一个时间戳?
如果您只想获取给定时间戳记之前的最后一个时间戳记,则下面的示例仅使用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');
然后创建休眠查询:
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")
,它返回01-MAR- 2017-02-01 00:00:00.0
之前的最后一个时间戳。
但是,如果为不存在的记录myService.getPriorTimestamp("01-MAR-2017")
,它将返回NULL
如果运行表myService.getPriorTimestamp("01-JAN-2017")
最小的时间戳,则返回NULL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.