不同我有包含以下列定義Oracle表:時區結果與SYSTIMESTAMP
COLUMN_NAME : RESERVATIONDATE
DATA_TYPE : TIMESTAMP(6)
NULLABLE : Yes
DATA_DEFAULT: null
然後,從內的Java I執行以下命令:
insert into my_table (col1, col2, reservationdate) values (:np1, :np2, systimestamp)
然後別處我執行下面的命令,其目的是返回小於X秒前添加的行。
select * from my_table where reservationDate >= systimestamp - NUMTODSINTERVAL(:seconds, 'SECOND')
但是,儘管保留日期晚於標識點,但沒有任何行被返回。
select col1,
col2,
reservationdate,
systimestamp as b,
systimestamp - NUMTODSINTERVAL(5, 'SECOND') as c
from my_table
這給下面的輸出:
col1: value1
col2: value2
reservationdate:2017-06-14 14:31:00.746173
b :2017-06-14 15:31:00.905617
c :2017-06-14 15:30:55.905617
注意,返回的值b
和c
基本上是一個
因此,我也從同一個應用程序運行以下命令小時提前reservationdate
。
上運行SQL開發人員在同一臺機器上運行的Java應用程序提供了正確的價值觀相同的請求:
reservationdate:14-JUN-17 02.31.00.746173000 PM
b :14-JUN-17 02.58.32.863300000 PM +00:00
c :14-JUN-17 02.58.27.863300000 PM +00:00
甲骨文是一個虛擬機,其中的Unix日期的輸出上運行:
Wed Jun 14 14:18:11 UTC 2017
而且該機在哪裏運行Java:
Wed Jun 14 15:21:24 BST 2017
顯然這是一個時區問題,但我並不確切地知道它來自哪裏。畢竟,我始終使用systimestamp
,目標是在數據庫服務器上執行所有時間戳計算。
我的請求經過了Spring的NamedParameterJdbcTemplate
,我正在使用Oracle Database 11g Express Edition 11.2.0.2.0
。
當你運行ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT ='YYYY-MM-DD HH24:MI:SS TZH:TZM'時,你會得到什麼? –
對不起,之前呢?在Java應用程序的命令中,還是在SQL Developer中測試之前? – Rich
在兩種情況下都可以使用 –