希望有人可以启发我...
我今天早上到达办公室,发现自动化的(通过OS CRON)SQL * Plus脚本在0100BST处开始失败,并且一直持续到0230BST,直到由于以下Oracle错误从BST切换到GMT为止。>
"*ERROR at line 20: ORA-08186: invalid timestamp specified"
下面的SQL已删除一些标识名称,但在语法上与失败的名称相同。
SELECT TO_CHAR( MIN(ioh.mdstamp), 'DD-MON-YY hh24:mi:ss') First_Update , TO_CHAR( MAX(ioh.mdstamp), 'DD-MON-YY hh24:mi:ss') Last_Update , ioh.consignment , ioh.order , CASE ioh.ord_type WHEN 'T' THEN 'STORE MOVE' WHEN 'S' THEN 'CUST DEL' END Movement_Type , ioh.status Order_Status , ioh.site_id Site , COUNT(\*) Attempts FROM table1 VERSIONS BETWEEN TIMESTAMP from_tz(cast((sysdate) as timestamp),'Europe/London') - INTERVAL '20' MINUTE AND MAXVALUE ioh WHERE versions_operation = 'I' And ioh.client_id = 'client1' AND ioh.status = 'Cancelled' AND ioh.MSTATUS = 'Pending' GROUP BY ioh.consignment , ioh.order , ioh.ord_type , ioh.status , ioh.site_id ORDER BY ioh.consignment , ioh.order_id , 2
环境是:
该脚本在通过OS Cron调用的BASH包装脚本中每15分钟执行一次。
sqlplus -s $CONNECT_DCS << ! >> ${f_SQLResults} @${SQL_SCRIPTS}/${__SCRIPTNAME_NOEXT}.sql; exit; !
另一个脚本捕获了操作系统的BST到DST的更改:
--------------------------------------- Checking for rejections due to invalid address Sun 27 Oct **01:47:11 BST** 2019 got count 0 0 - no rejections --------------------------------------- --------------------------------------- Checking for rejections due to invalid address Sun 27 Oct **01:02:10 GMT** 2019 got count 0 0 - no rejections ---------------------------------------
如果从BST到DST的更改未在0200BST发生更改,则故障在BST的0100h开始发生,并一直持续到0230h BST。当我确保时区为“欧洲/伦敦”时,我认为数据库会自动处理此DST更改,但我无法理解为什么不这样做。我确实想到的一个想法是,使用MAX SCN值或将NLS_TERRITORY设置为'AMERICA'可能与它有关,尽管我曾想过在sql中显式设置时区可以解决此问题。
已设置以下数据库配置:
SQL> select dbtimezone from dual; DBTIME ------ +00:00 1 row selected. SQL> select sessiontimezone from dual; SESSIONTIMEZONE --------------------------------------------------------------------------- Europe/London 1 row selected. SQL> select SYSTIMESTAMP from dual; SYSTIMESTAMP --------------------------------------------------------------------------- 28-OCT-19 09.30.36.653265 AM +00:00 1 row selected. SQL> !date Mon 28 Oct 09:30:42 GMT 2019 SQL> set lines 200 SQL> l 1* select * from v$nls_parameters SQL> / PARAMETER VALUE CON_ID ---------------------------------------------------------------- ---------------------------------------------------------------- ---------- NLS_LANGUAGE AMERICAN 0 NLS_TERRITORY AMERICA 0 NLS_CURRENCY $ 0 NLS_ISO_CURRENCY AMERICA 0 NLS_NUMERIC_CHARACTERS ., 0 NLS_CALENDAR GREGORIAN 0 NLS_DATE_FORMAT DD-MON-RR 0 NLS_DATE_LANGUAGE AMERICAN 0 NLS_CHARACTERSET AL32UTF8 0 NLS_SORT BINARY 0 NLS_TIME_FORMAT HH.MI.SSXFF AM 0 PARAMETER VALUE CON_ID ---------------------------------------------------------------- ---------------------------------------------------------------- ---------- NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM 0 NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR 0 NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR 0 NLS_DUAL_CURRENCY $ 0 NLS_NCHAR_CHARACTERSET AL16UTF16 0 NLS_COMP BINARY 0 NLS_LENGTH_SEMANTICS CHAR 0 NLS_NCHAR_CONV_EXCP FALSE 0 19 rows selected. SQL> SELECT TO_CHAR(SYSTIMESTAMP, 'tzr') FROM dual; TO_CHAR(SYSTIMESTAMP,'TZR') -------------------------------- +00:00 1 row selected. SQL> !date +"%Z %z" GMT +0000 SQL> !timedatectl Local time: Mon 2019-10-28 11:57:36 GMT Universal time: Mon 2019-10-28 11:57:36 UTC RTC time: Mon 2019-10-28 11:57:36 Time zone: Europe/London (GMT, +0000) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: no Last DST change: DST ended at Sun 2019-10-27 01:59:59 BST Sun 2019-10-27 01:00:00 GMT Next DST change: DST begins (the clock jumps one hour forward) at Sun 2020-03-29 00:59:59 GMT Sun 2020-03-29 02:00:00 BST SQL>
[如果有人能帮助我,我将非常感激。
欢呼声
PS:刚注意到我们的glogin.sql有以下行:“ alter session set time_zone ='Europe / London';”
希望有人能启发我...今天早上我到达办公室,发现自动化的(通过OS CRON)SQL * Plus脚本在0100BST处开始失败,并一直持续到0230BST ...
您需要更改NLS_TIME
和NLS_TIMESTAMP
参数。通过发出以下命令,可以应用一种快速的解决方法:
SQL> ALTER SESSION SET NLS_TIME_FORMAT = 'HH24:MI:SSXFF';
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD/MM/RRRR HH24:MI:SSXFF';
SQL> ALTER SESSION SET NLS_TIME_TZ_FORMAT = 'HH24:MI:SSXFF TZR';
SQL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'DD/MM/RRRR HH24:MI:SSXFF TZR';