A Table named TRADES has the following structure and Data:
CREATE TABLE trades (
trade_id NUMBER,
trade_execution_tmstmp TIMESTAMP(6),
time_zone_name VARCHAR2 (30 BYTE),
last_trade_marker TIMESTAMP(6)
);
trade_id -- Unique ID for every trade
trade_execution_tmstmp-在EST执行交易的时间time_zone_name-交易的本地时区last_trade_marker-在特定日期最后一次交易的EST时间
需求是这样的:我必须开发一个程序将隔日交易插入另一个表next_day_trades中。
如果该过程在1月2日运行(在这种情况下),那么第二天的交易只有trade_id =4。因此,next_day_trades表将有1条记录。
决定第二天交易的逻辑如下:trade_execution_tmstmp在EST中。必须将其转换为本地时间戳,以查看何时在本地市场实际执行交易。在这种情况下,澳大利亚/悉尼适用于所有行业。last_trade_marker是该市场中最后一笔交易的时间。
下面是表格中第3和第4条记录的说明。
交易3在'1/2/2015 1:00:00.000000 PM'(EST)执行。如果交易在12之间执行,则相当于澳大利亚/悉尼时间为'1/3/2015 4:00:00.000000 AM'1月2日的最后交易标记为'1/3/2015 2:00:00.000000 AM' 00-02:00 AM(最后交易标记),这将是第二天的交易。因此,交易3不是隔日交易。
交易4在'1/2/2015 10:00:00.000000 AM'(EST)执行。如果交易在12之间执行,则相当于澳大利亚/悉尼时间为'1/3/2015 1:00:00.000000 AM'1月2日的最后交易标记为'1/3/2015 2:00:00.000000 AM' 00-02:00 AM(最后交易标记),这将是第二天的交易。因此,交易4是第二天的交易。
注意:仅在存储的Proc执行日包括次日交易。这就是为什么,如果Proc在1月2日运行,则仅将交易4插入next_day_trades表中而不将交易2插入。
请帮助我提出一个用于插入的SELECT查询。
您可以分两步将EST时间转换为声明的时区;首先,通过声明原始值位于哪个时区from_tz()
,然后使用at time zone
转换运算符。
您还需要将最后一个商标标记转换为带有时区的时间戳,并且由于还需要捕获当天的开始时间(在00:00-02:00范围内),因此需要将其截短-日期-将其应用于该日期之前from_tz()
。
select trade_id, trade_execution_tmstmp, time_zone_name, last_trade_marker,
from_tz(trade_execution_tmstmp, 'EST') at time zone time_zone_name
as trade_execution_local_tmstmp,
from_tz(cast(trunc(last_trade_marker) as timestamp), time_zone_name)
as last_trade_marker_start,
from_tz(last_trade_marker, time_zone_name) as last_trade_marker_end
from trades;
在更改会话以格式化值方面略有不同:
alter session set NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
alter session set NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS TZR';
得到:
TRADE_ID TRADE_EXECUTION_TMSTM TIME_ZONE_NAME LAST_TRADE_MARKER TRADE_EXECUTION_LOCAL_TMSTMP LAST_TRADE_MARKER_START LAST_TRADE_MARKER_END
---------- --------------------- ---------------- --------------------- ------------------------------------ ------------------------------------ ------------------------------------
1 2015-01-01 13:00:00 Australia/Sydney 2015-01-02 02:00:00 2015-01-02 05:00:00 AUSTRALIA/SYDNEY 2015-01-02 00:00:00 AUSTRALIA/SYDNEY 2015-01-02 02:00:00 AUSTRALIA/SYDNEY
2 2015-01-01 10:00:00 Australia/Sydney 2015-01-02 02:00:00 2015-01-02 02:00:00 AUSTRALIA/SYDNEY 2015-01-02 00:00:00 AUSTRALIA/SYDNEY 2015-01-02 02:00:00 AUSTRALIA/SYDNEY
3 2015-01-02 13:00:00 Australia/Sydney 2015-01-03 02:00:00 2015-01-03 05:00:00 AUSTRALIA/SYDNEY 2015-01-03 00:00:00 AUSTRALIA/SYDNEY 2015-01-03 02:00:00 AUSTRALIA/SYDNEY
4 2015-01-02 10:00:00 Australia/Sydney 2015-01-03 02:00:00 2015-01-03 02:00:00 AUSTRALIA/SYDNEY 2015-01-03 00:00:00 AUSTRALIA/SYDNEY 2015-01-03 02:00:00 AUSTRALIA/SYDNEY
根据我理解的规则,您可以比较那些调整后的列值来决定是否应该进行第二天交易:
select trade_id, trade_execution_tmstmp, time_zone_name, last_trade_marker,
case when from_tz(trade_execution_tmstmp, 'EST') at time zone time_zone_name
between from_tz(cast(trunc(last_trade_marker) as timestamp), time_zone_name)
and from_tz(last_trade_marker, time_zone_name)
then 'Yes' else 'No' end as next_day_trade
from trades;
TRADE_ID TRADE_EXECUTION_TMSTM TIME_ZONE_NAME LAST_TRADE_MARKER NEXT_DAY_TRADE
---------- --------------------- ---------------- --------------------- --------------
1 2015-01-01 13:00:00 Australia/Sydney 2015-01-02 02:00:00 No
2 2015-01-01 10:00:00 Australia/Sydney 2015-01-02 02:00:00 Yes
3 2015-01-02 13:00:00 Australia/Sydney 2015-01-03 02:00:00 No
4 2015-01-02 10:00:00 Australia/Sydney 2015-01-03 02:00:00 Yes
“之间”可能不是此处的正确选择;取决于是否将恰好在02:00:00.0进行的交易计为第二天。您可能需要
trade_execution_local_tmstmp >= last_trade_marker_start
and trade_execution_local_tmstmp < last_trade_marker_end
无论哪种方式,您都可以使用相同的条件来决定将哪些行复制到单独的表中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句