Sql 使用闪回查询时BST到GMT Oracle错误(ORA-08186)

Sql 使用闪回查询时BST到GMT Oracle错误(ORA-08186),sql,oracle,database-administration,dst,rhel7,Sql,Oracle,Database Administration,Dst,Rhel7,希望有人能启发我 我今天早上来到办公室,发现一个自动化(通过OS CRON)SQL*Plus脚本在英国夏令时0100BST开始出现故障,并在从英国夏令时切换到格林尼治时间0230BST期间继续出现故障,出现以下Oracle错误 "*ERROR at line 20: ORA-08186: invalid timestamp specified" 下面的SQL已经编辑了一些识别名称,但在语法上与失败的SQL相同 SELECT TO_CHAR( MIN(ioh.mdstamp), 'DD-MON

希望有人能启发我

我今天早上来到办公室,发现一个自动化(通过OS CRON)SQL*Plus脚本在英国夏令时0100BST开始出现故障,并在从英国夏令时切换到格林尼治时间0230BST期间继续出现故障,出现以下Oracle错误

"*ERROR at line 20:
ORA-08186: invalid timestamp specified"
下面的SQL已经编辑了一些识别名称,但在语法上与失败的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
  • DB:Oracle数据库12c企业版12.1.0.2.0版-64位 生产
  • SQL*Plus:12.1.0.2.0版
该脚本在通过OS Cron调用的BASH包装器脚本中每隔15分钟执行一次

sqlplus -s $CONNECT_DCS << ! >> ${f_SQLResults}
        @${SQL_SCRIPTS}/${__SCRIPTNAME_NOEXT}.sql;  
        exit;
!
故障在英国夏令时0100时开始发生,并持续发生,直到英国夏令时0230时,如果英国夏令时变更为英国夏令时,故障才会发生。由于我确保时区为“欧洲/伦敦”,我原以为DB会自动处理DST更改,但我不明白为什么它没有。我的一个想法是,它可能与使用最大SCN值或NLS_TERRITORY bwing设置为“AMERICA”有关,尽管agian我认为在sql QQ中明确设置时区可以解决这个问题

已设置以下数据库配置:

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'”

您需要更改
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';
因为您正在寻找小时格式


例如查询中的
TO_CHAR(MIN(ioh.mdstamp),'DD-MON-YY hh24:mi:ss')

在理想情况下,当有人在这里用
[数据库管理]
标记一个问题时,问题向导会弹出一个建议,建议在时间戳之间使用我建议的
(SYSTIMESTAMP-间隔'20'分钟)和MAXVALUE
,则您不应该对时区有任何问题。
时间戳与{LOCAL}的比较时区总是在UTC执行。@APC感谢您的提醒。只有在我发布问题后才意识到存在dba站点。我后来添加了标签,但没有显示弹出窗口。我曾考虑在那里重新发布,但不确定重复条目是否会违反一些内部规则#newbie@WernfriedDomsche谢谢。恐怕我还没有完全理解。使用我的代码“从_tz(cast((sysdate)作为时间戳),“欧洲/伦敦”)-在2019年10月27日英国夏令时1点(2019年10月27日协调世界时)间隔“20分钟”。如果它按照您的建议转换为协调世界时,它肯定会返回2019年10月27日协调世界时2340分?为什么它会失败“*第20行错误:ORA-08186:指定的时间戳无效"因为0100h是有效的BST和UTC/GMT时间?谢谢。它们不仅会影响返回/显示的数据吗?我的问题似乎是在配置/比较阶段-我想!欢迎@Mick。您可以在运行脚本之前发出这些命令。是的,这些命令只会影响当前会话,但应该可以正常工作。如果您想恢复olve全局(整个数据库)您需要更改系统命令,这非常危险,应该咨询DBA。是的,我知道这些命令,谢谢。我不明白的是它们如何影响DST边界上日期/时间值的比较。我一直假设这些命令(可能是错误的)您所列出的仅用于显示/输出目的。根据您所说的,我需要将数据库区域更改为“联合王国”,以用于全球(系统)解决方案-正确吗?我的意思是更改它们不仅是为了显示目的,而且还影响当前会话@Mick中的操作方式。您尝试过吗?顺便说一句,我没有告诉任何关于区域的信息,但是
NLS\U时间*
参数。是的……我知道您没有提到“区域”,但我知道您告诉我的那些NLS\U时间*参数我想用它来获得一个默认的输出-从我读到的关于他们的信息中!再次感谢。
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';