Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 提取(从…开始的小时数)提取错误的小时数_Sql_Oracle11g_Timestamp - Fatal编程技术网

Sql 提取(从…开始的小时数)提取错误的小时数

Sql 提取(从…开始的小时数)提取错误的小时数,sql,oracle11g,timestamp,Sql,Oracle11g,Timestamp,我试图根据同一小时创建的行数生成报告,并尝试使用提取功能对行进行分组,但它会更改结果的信息,例如: select to_char(resolved_time,'YY/MM/DD') Day, to_char(resolved_time, 'HH24') hour_tmp, extract(hour from resolved_time) Hour from RESOLUTION_HISTORY h where resolved_time >= timestamp '2017-

我试图根据同一小时创建的行数生成报告,并尝试使用提取功能对行进行分组,但它会更改结果的信息,例如:

 select 
 to_char(resolved_time,'YY/MM/DD') Day,
 to_char(resolved_time, 'HH24') hour_tmp,
 extract(hour from resolved_time) Hour
 from RESOLUTION_HISTORY h
 where resolved_time >= timestamp '2017-01-01 00:00:00'
 and resolved_time < timestamp '2017-01-02 00:00:00'
 and modified_by in 'user1'
 order by 2;
正如你所见,解析时间的实际值和摘录之间存在差异,试图改变我的会话,但似乎没有帮助。
是否有其他选项可以在本地会话上更改此设置?

您看到的差异是UTC和与列值关联的时区之间的偏移量。您可以看到具有以下功能的简化版本:

select extract(hour from timestamp '2017-01-01 00:00:00 America/New_York') from dual;

EXTRACT(HOURFROMTIMESTAMP'2017-01-0100:00:00AMERICA/NEW_YORK')
--------------------------------------------------------------
                                                             5
DBTIMEZONE是推荐的+00:00,数据库服务器在BST上,我的会话也是通过欧洲/伦敦的BST。但这些都不相关

:

从具有时区值的日期时间提取时,返回的值以UTC为单位

如果您的列是带有本地时区的时间戳,您将看到会话时区中的小时,这可能更不有用

您可以通过将列强制转换为普通时间戳来解决此问题,这实际上会截断时区信息:

extract(hour from cast(resolved_time as timestamp))
通过您的数据,您可以看到以下方面的差异:

select 
 to_char(resolved_time,'YYYY-MM-DD HH24:MI:SS TZR') full_value,
 to_char(resolved_time,'YY/MM/DD') Day,
 to_char(resolved_time, 'HH24') hour_tmp,
 extract(hour from resolved_time) Hour_utc,
 extract(hour from cast(resolved_time as timestamp)) Hour
 from RESOLUTION_HISTORY h
 where resolved_time >= timestamp '2017-01-01 00:00:00 America/New_York'
 and resolved_time < timestamp '2017-01-02 00:00:00 America/New_York'
 and modified_by in 'user1'
 order by 2;

FULL_VALUE                                           DAY      HO   HOUR_UTC       HOUR
---------------------------------------------------- -------- -- ---------- ----------
2017-01-01 12:00:00 AMERICA/NEW_YORK                 17/01/01 12         17         12
顺便说一句,我在过滤条件中包含了假定的列时区值,因此它不必依赖于会话时区。如果您有来自多个时区的值,那么您可能也需要在过滤器中考虑这些值,并且可能需要在提取和分组之前将列值转换为特定的区域。这取决于你想做什么


另请参见。

执行查询时,是否可以确认列数据类型为带时区的时间戳而非普通时间戳、所查询值的时区以及会话时区?还有你的数据库时区?是的,这是时区的时间戳谢谢!从castresolved_时间中提取一小时,时间戳小时起作用!
select 
 to_char(resolved_time,'YYYY-MM-DD HH24:MI:SS TZR') full_value,
 to_char(resolved_time,'YY/MM/DD') Day,
 to_char(resolved_time, 'HH24') hour_tmp,
 extract(hour from resolved_time) Hour_utc,
 extract(hour from cast(resolved_time as timestamp)) Hour
 from RESOLUTION_HISTORY h
 where resolved_time >= timestamp '2017-01-01 00:00:00 America/New_York'
 and resolved_time < timestamp '2017-01-02 00:00:00 America/New_York'
 and modified_by in 'user1'
 order by 2;

FULL_VALUE                                           DAY      HO   HOUR_UTC       HOUR
---------------------------------------------------- -------- -- ---------- ----------
2017-01-01 12:00:00 AMERICA/NEW_YORK                 17/01/01 12         17         12