Oracle Developer - Hour Between 1 and 12 错误,在一台机器上工作但在另一台机器上不工作

Oracle Developer - Hour Between 1 and 12 error, works on one machine but not another

我 运行 遇到一个问题,我在 2 台机器上有 oracle 开发人员,相同的代码 运行 在一台机器上成功,但出现“小时必须在 1 到 12 之间”的错误另一方面,两者都使用相同版本的 Oracle。 代码片段如下。不知道为什么这会有所不同,我还应该注意,在它出现故障的机器上,是我一年多以前开发的机器,当时它运行良好。

这个项目的objective是根据脚本是运行的时候,如果是0400以后的,那么运行s对于今天日期的日期参数>0400对于时间。如果 运行 时在 0400 之前,它 运行 是昨天的日期 >0400 直到。

and cast(scn_time as timestamp) >= case when to_char(current_timestamp, 'HH24:MI:SS') 
> ('04:00:00') then to_timestamp(to_char(trunc(sysdate)||' 04.00.00 AM')) else 
to_timestamp(to_char(trunc(sysdate-1)||'  4.00.00 AM')) end

如有任何帮助,我们将不胜感激。

正如@Abra 所暗示的,您的两个 SQL 开发人员安装具有不同的 NLS_TIMESTAMP_FORMAT 设置(在工具->首选项->数据库->NLS 中)。您不应该依赖 NLS 设置或隐式转换,就像您当前将截断日期转换为字符串时那样。当您使用 CURRENT_TIMESTAMP 时,您还依赖于您的会话时区 - 这也可能会根据会话设置获得不同的值。

您不需要在此处与字符串相互转换,您可以这样做:

and scn_time >= case
  when extract(hour from current_timestamp) >= 4 
    then trunc(sysdate) + interval '4' hour 
  else 
    then trunc(sysdate) - interval '1' day + interval '4' hour 
    -- or: then trunc(sysdate) - interval '20' hour 
  end

and scn_time >= trunc(sysdate) + interval '1' hour * case
  when extract(hour from current_timestamp) >= 4 then 4
  else -20
  end

and (
  (extract(hour from current_timestamp) >= 4
    and scn_time >= trunc(sysdate) + interval '4' hour)
  or
  (extract(hour from current_timestamp) < 4
    and scn_time >= trunc(sysdate) - interval '20' hour)
 )

这也使得添加上限更容易:

and (
  (extract(hour from current_timestamp) >= 4
    and scn_time >= trunc(sysdate) + interval '4' hour)
  or
  (extract(hour from current_timestamp) < 4
    and scn_time >= trunc(sysdate) - interval '20' hour)
    and scn_time < trunc(sysdate) + interval '4' hour)
 )

scn_time 转换为 TIMESTAMP 可能不是必需的,并且将函数应用于 table 列通常会阻止使用其上的任何索引(FBI 除外)。如果它已经是一个日期,那么不要管它,只需将比较的 right-hand 侧也设为日期即可。

我暂时将 CURRENT_TIMESTAMP 留在那里,但您可能需要 SYSTIMESTAMP(它不受会话设置的影响);尽管这取决于 scn_time 实际是什么数据类型以及它代表什么。如果那是记录用于跟踪的 SCN 时间,那么它可能已经是一个时间戳;在这种情况下,将 right-hand 端转换为相同的数据类型。如果它是一个字符串那么它不应该是,但是如果你坚持使用它然后使用 to_date() 和适当的格式掩码将它明确地转换为日期。