现在,我编写的存储过程按小时计算不同时区的值。我已经有一个名为UTC_OFFSET的列,显示每个实体所在的时区。使用这些每小时值我必须计算每天的总数,但必须在之前“转换为太平洋标准时间”(UTC_OFFSET = 5)聚集/计算。我正在艰难地围绕如何对各种场景进行分组(即没有DST的状态,不同时区的状态等)。 UTC_OFFSET列表示不同的时区。我尝试使用case语句,但我不确定我是如何将它与我的聚合绑定的。
注意: HR_NUM列是该时区内当天的第N小时。 “值”列是我们尝试聚合/求和以获取该特定日期的总值的值。
例如:太平洋标准时间(晚上11点)的第23小时将是第二天(2014年4月5日)美国东部时间(凌晨2点)的第2小时。但是,如果当时存在与EST UTC_OFFSET(5)相关的值,则仍需要使用该值来计算今天的总数(4/4/2018)。
以下是我的一些示例数据:
Calculation_ID Entity Value HR UTC_OFFSET HR_NUM Data_Date
1 1 8 18-APR-19 04.00.00 AM 5 1 1092019
2 1 4 18-APR-19 05.00.00 AM 5 2 1092019
3 1 5 18-APR-19 06.00.00 AM 5 3 1092019
4 2 7 18-APR-19 01.00.00 AM 8 1 1092019
5 2 12 18-APR-19 02.00.00 AM 8 2 1092019
6 3 15 18-APR-20 01.00.00 AM 7 22 1102019
7 4 22 18-APR-19 02.00.00 AM 5 2 1092019
8 3 17 18-APR-19 12.00.00 AM 8 24 1092019
以下是我想要的:
Entity_Id Created_Dt Value UTC_Offset Data_Date
1 04-APR-17 17 5 1092019
2 04-APR-17 19 8 1092019
3 04-APR-17 15 7 1092019
4 04-APR-17 22 5 1092019
数据日期格式采用以下格式:(DDDYYYY)。
答案 0 :(得分:2)
请勿将值存储为具有单独DATE
列的UTC_offset
数据类型。
将其存储为TIMESTAMP WITH TIME ZONE
数据类型,然后您可以使用AT TIME ZONE 'PST'
转换为公共时区。
Oracle安装程序:
CREATE TABLE table_name (
Calculation_ID NUMBER(10,0),
Entity NUMBER(10,0),
Value NUMBER(10,0),
HR TIMESTAMP WITH TIME ZONE
);
INSERT INTO table_name
SELECT 1, 1, 8, TIMESTAMP '2018-04-19 04:00:00+05:00' FROM DUAL UNION ALL
SELECT 2, 1, 4, TIMESTAMP '2018-04-19 05:00:00+05:00' FROM DUAL UNION ALL
SELECT 3, 1, 5, TIMESTAMP '2018-04-19 06:00:00+05:00' FROM DUAL UNION ALL
SELECT 4, 2, 7, TIMESTAMP '2018-04-19 01:00:00+08:00' FROM DUAL UNION ALL
SELECT 5, 2, 12, TIMESTAMP '2018-04-19 02:00:00+08:00' FROM DUAL UNION ALL
SELECT 6, 3, 15, TIMESTAMP '2018-04-20 01:00:00+07:00' FROM DUAL UNION ALL
SELECT 7, 4, 22, TIMESTAMP '2018-04-19 02:00:00+05:00' FROM DUAL UNION ALL
SELECT 8, 5, 17, TIMESTAMP '2018-04-19 12:00:00+08:00' FROM DUAL;
<强>查询强>:
SELECT Entity,
SYSDATE AS Created_dt,
SUM( VALUE ) AS value,
TRUNC( HR AT TIME ZONE 'PST' ) AS day
FROM table_name
GROUP BY
entity,
TRUNC( HR AT TIME ZONE 'PST' );
<强>输出强>:
ENTITY CREATED_DT VALUE DAY
------- ----------- ------- ---------
2 04-APR-18 19 18-APR-18
4 04-APR-18 22 18-APR-18
3 04-APR-18 15 19-APR-18
1 04-APR-18 17 18-APR-18
5 04-APR-18 17 18-APR-18