Sql Oracle Developer—1到12小时的错误,在一台机器上工作,但在另一台机器上不工作
我遇到了一个问题,我让oracle developer在两台机器上运行,相同的代码在一台机器上运行成功,但在另一台机器上出现“小时必须介于1和12之间”错误,两台机器上的oracle版本相同。 下面是代码片段。我不知道为什么会有不同的表现,我还应该注意到,在它出现故障的机器上,是我在一年多前开发的机器,当时它工作得很好 此项目的目标基于脚本的运行时间,如果脚本在0400之后运行,则它将针对时间的日期参数todays date>0400运行。如果运行时它在0400之前,则它将运行昨天日期>0400直到Sql Oracle Developer—1到12小时的错误,在一台机器上工作,但在另一台机器上不工作,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我遇到了一个问题,我让oracle developer在两台机器上运行,相同的代码在一台机器上运行成功,但在另一台机器上出现“小时必须介于1和12之间”错误,两台机器上的oracle版本相同。 下面是代码片段。我不知道为什么会有不同的表现,我还应该注意到,在它出现故障的机器上,是我在一年多前开发的机器,当时它工作得很好 此项目的目标基于脚本的运行时间,如果脚本在0400之后运行,则它将针对时间的日期参数todays date>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 Developer安装具有不同的NLS\u时间戳\u格式设置(在工具->首选项->数据库->NLS中)。当您将截断的日期转换为字符串时,您不应该像当前那样依赖NLS设置或隐式转换。当您使用当前_时间戳时,您也依赖于您的会话时区,这可能会根据会话设置获得不同的值 您不需要在此处转换字符串,您可以执行以下操作:
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
或
或
和(
(提取(从当前时间戳开始的小时数)>=4
和scn_时间>=trunc(sysdate)+间隔“4”小时)
或
(从当前时间戳中提取小时数)<4
和scn_时间>=trunc(系统日期)-间隔“20”小时)
)
这也使得添加上限变得更容易:
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)
)
和(
(提取(从当前时间戳开始的小时数)>=4
和scn_时间>=trunc(sysdate)+间隔“4”小时)
或
(从当前时间戳中提取小时数)<4
和scn_时间>=trunc(系统日期)-间隔“20”小时)
和scn_时间
将scn\u time
强制转换为时间戳可能是不必要的,并且将函数应用于表列通常会阻止对其使用任何索引(FBI除外)。如果它已经是一个日期,那就别管它了,只是把比较的右边也当作一个日期
我现在已经在那里留下了当前的_时间戳,但您可能需要SYSTIMESTAMP(它不受会话设置的影响);尽管这取决于scn\U时间实际上是什么数据类型以及它代表什么。如果这是记录用于跟踪的SCN时间,那么它可能已经是一个时间戳;在这种情况下,将右侧强制转换为相同的数据类型。如果它是一个字符串,那么它就不应该是,但是如果你被它卡住了,那么就用
to_date()
和适当的格式掩码显式地将它转换为日期。正如@Abra所暗示的,你的两个SQL Developer安装有不同的NLS_时间戳格式设置(在工具->首选项->数据库->NLS中)。当您将截断的日期转换为字符串时,您不应该像当前那样依赖NLS设置或隐式转换。当您使用当前_时间戳时,您也依赖于您的会话时区,这可能会根据会话设置获得不同的值
您不需要在此处转换字符串,您可以执行以下操作:
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
或
或
和(
(提取(从当前时间戳开始的小时数)>=4
和scn_时间>=trunc(sysdate)+间隔“4”小时)
或
(从当前时间戳中提取小时数)<4
和scn_时间>=trunc(系统日期)-间隔“20”小时)
)
这也使得添加上限变得更容易:
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)
)
和(
(提取(从当前时间戳开始的小时数)>=4
和scn_时间>=trunc(sysdate)+间隔“4”小时)
或
(从当前时间戳中提取小时数)<4
和scn_时间>=trunc(系统日期)-间隔“20”小时)
和scn_时间
将scn\u time
强制转换为时间戳可能是不必要的,并且将函数应用于表列通常会阻止对其使用任何索引(FBI除外)。如果它已经是一个日期,那就别管它了,只是把比较的右边也当作一个日期
我现在已经在那里留下了当前的_时间戳,但您可能需要SYSTIMESTAMP(它不受会话设置的影响);尽管这取决于scn\U时间实际上是什么数据类型以及它代表什么。如果这是记录用于跟踪的SCN时间,那么它可能已经是一个时间戳;在这种情况下,将右侧强制转换为相同的数据类型。如果它是一个字符串,那么它就不应该是字符串,但是如果您一直在使用它,那么请使用
to_date()
和适当的格式掩码将其显式转换为日期。您是否阅读了函数的文档?您使用的是默认格式。两台机器上的默认格式相同吗?答案是您和Alex的支持,这台机器上的默认格式不同,如果您作为答案发布,我会加上它。您是否阅读了函数的文档?您使用的是默认格式。两台机器上的默认格式相同吗?答案是您和Alex的支持,这台机器上的默认格式不同,如果您作为答案发布,我会加上它。感谢您的指导,这确实有帮助,根本问题是调整了日期格式默认值。最好不要依赖NLS设置。我调整了上一个示例以适合我的代码,效果很好。我写这篇文章是为了适应spotfire的数据连接,因此我在过去曾与一些时区项目进行过斗争,因为服务器位置的原因,这些时区项目与当前时间戳的转换有关,感谢您的指导,这确实有帮助,根本问题是调整了日期格式默认值。最好不要依赖NLS设置。我调整了上一个示例以适合我的代码,效果很好。我写这篇文章是为了适应spotfire的数据连接,因此我在过去曾与一些时区项目进行过斗争,这些时区项目涉及到由于服务器位置而使用当前时间戳进行的转换,