簡體   English   中英

JDBC PL / SQL上一行(LAG)僅返回當前值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM