JDBC PL / SQL上一行(LAG)仅返回当前值

时间:2017-05-23 14:40:06

标签: java sql oracle jdbc plsql

我目前有一个包含各种数据的时间戳表,以及一个需要根据给定时间戳't'返回prev时间戳的函数。

我在JDBC代码中的预准备语句中有以下查询:

String query = "SELECT LAG(?,1) OVER (ORDER BY TIME_STAMP DESC) FROM " + TABLE;

preparedStatement.setTimestamp(1, t); 

结果集与我的参数的时间戳完全相同,并且我的数据库中有多少行。

如何返回PREVIOUS时间戳?

1 个答案:

答案 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