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