如何将每小时计算从派生的不同时区转换为PST进行日常计算?

时间:2018-04-04 20:01:45

标签: sql oracle

现在,我编写的存储过程按小时计算不同时区的值。我已经有一个名为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)。

1 个答案:

答案 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