Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle Developer—1到12小时的错误,在一台机器上工作,但在另一台机器上不工作_Sql_Oracle_Oracle Sqldeveloper - Fatal编程技术网

Sql Oracle Developer—1到12小时的错误,在一台机器上工作,但在另一台机器上不工作

Sql Oracle Developer—1到12小时的错误,在一台机器上工作,但在另一台机器上不工作,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我遇到了一个问题,我让oracle developer在两台机器上运行,相同的代码在一台机器上运行成功,但在另一台机器上出现“小时必须介于1和12之间”错误,两台机器上的oracle版本相同。 下面是代码片段。我不知道为什么会有不同的表现,我还应该注意到,在它出现故障的机器上,是我在一年多前开发的机器,当时它工作得很好 此项目的目标基于脚本的运行时间,如果脚本在0400之后运行,则它将针对时间的日期参数todays date>0400运行。如果运行时它在0400之前,则它将运行昨天日期>0400

我遇到了一个问题,我让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的数据连接,因此我在过去曾与一些时区项目进行过斗争,这些时区项目涉及到由于服务器位置而使用当前时间戳进行的转换,