Надеюсь, что кто-то может просветить меня ...
Я пришел в офис этим утром, чтобы узнать, что автоматизированный (через ОС CRON) сценарий SQL * Plus начал давать сбой в 0100BST и продолжал делать это до тех пор, пока0230BST во время переключения с BST на GMT со следующей ошибкой Oracle
"*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
Среда:
- ОС: RHEL7.2
- БД: Oracle Database 12c Enterprise Edition, выпуск 12.1.0.2.0 - 64-разрядная версия
- SQL * Plus: выпуск12.1.0.2.0
Сценарий выполняется каждые 15 минут в сценарии-оболочке BASH, вызываемом через Cron ОС.
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
---------------------------------------
Сбои начались в 01:00 BST и продолжались до 02:30 BST, если изменение BST на DST не изменилось в 02:00 BST. Поскольку я гарантирую, что часовой пояс «Европа / Лондон», я подумал, что БД будет автоматически обрабатывать это изменение летнего времени, но я не понимаю, почему это не так. Одна мысль, которая пришла мне в голову, заключается в том, что это может иметь какое-то отношение к использованию значения MAX SCN или значения NLS_TERRITORY, установленного как «AMERICA», хотя agian, я бы подумал, явно установив часовой пояс в 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';"