Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC PL/SQL上一行(LAG)仅返回当前值_Java_Sql_Oracle_Jdbc_Plsql - Fatal编程技术网

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

Java JDBC PL/SQL上一行(LAG)仅返回当前值,java,sql,oracle,jdbc,plsql,Java,Sql,Oracle,Jdbc,Plsql,我目前有一个包含各种数据的时间戳表,还有一个函数需要根据给定的时间戳“t”返回prev timestamp。 我在JDBC代码中准备好的语句中有以下查询: String query = "SELECT LAG(?,1) OVER (ORDER BY TIME_STAMP DESC) FROM " + TABLE; preparedStatement.setTimestamp(1, t); resultset与我的参数的时间戳完全相同,数据库中的行数与我的行数相同 如何返回上一个时间戳 如果

我目前有一个包含各种数据的时间戳表,还有一个函数需要根据给定的时间戳“t”返回prev timestamp。 我在JDBC代码中准备好的语句中有以下查询:

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

preparedStatement.setTimestamp(1, t); 
resultset与我的参数的时间戳完全相同,数据库中的行数与我的行数相同


如何返回上一个时间戳

如果您希望只获取给定时间戳之前的最后一个时间戳,下面的示例仅使用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.getPriorTimestamp01-MAR-2017,返回2017-02-01 00:00:00.0之前的最后一个时间戳

但如果为不存在的记录myService.getPriorTimestamp01-MAR-2017运行,则返回NULL


如果为表myService.getPriorTimestamp01-JAN-2017中的最小时间戳运行,它将返回NULL

查询字符串不应该是SELECT LAGTIME\u STAMP,1而不是表中的ORDER BY TIME\u STAMP DESC,而不是您发布的内容吗?@N00BPR0GRAMER否,这将返回整个表,只是偏移一个。我只需要一个相对于t的值。@N00bPr0grammer,尽管我可以做到这一点。大概有名单。是的,就是这个主意!Domenic我想知道您是希望在返回输入时间戳之前的最后一个时间戳之外,还是只返回输入时间戳之前的最后一个时间戳?你是想在这里一排只拿回一个场地吗?谢谢@Domenicportues很高兴听到这个消息。如果我能补充任何澄清,请告诉我