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