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()
和适当的格式掩码将它明确地转换为日期。
我 运行 遇到一个问题,我在 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()
和适当的格式掩码将它明确地转换为日期。