按时间戳和日期列连接表?
Join tables by timestamp and date columns?
我应该从两个日志 table 中检索数据(BALHDR
和 ZIF_LOG_XML_CONTENT
)。我的问题是日志 tables 之间的唯一共同点是创建条目的时间。查询必须针对 PERIOD 而不是 TIME POINT 有效。
但是,条目的时间在两个 table 中存储的格式不同。在 ZIF_LOG_XML_CONTENT
中它存储在一列中 TIMESTAMP
在另一个日志中 table 在 BALHDR
中它存储在两列中,其中 DATE
和 TIME
分开存放。
我一直试图转换成STRING
,但还是不行...
我做错了什么?
DATA: GV_DATEANDTIMETO TYPE STRING,
GV_DATETO TYPE STRING,
GV_TIMETO TYPE STRING,
GV_DATEANDTIMEFROM TYPE STRING,
GV_DATEFROM TYPE STRING,
GV_TIMEFROM TYPE STRING,
GV_DATUM TYPE STRING.
SELECT * FROM BALHDR INTO @GS_MSG_STRUKT WHERE
EXTNUMBER = @P_EXTID AND
OBJECT = @P_OBJ AND
SUBOBJECT = @P_SUBOBJ AND
ALUSER = @P_USER AND
( ALDATE_BALHDR >= @GV_INPUT_DATETO AND ALTIME_BALHDR >= @GV__INPUT_TIMETO ) AND
( ALDATE_BALHDR <= @GV_INPUT_DATEFROM AND ALTIME_BALHDR <= @GV__INPUT_TIMEFROM ) AND
MSG_CNT_E >= 1 OR MSG_CNT_AL IS ZERO.
concatenate GS_MSGTABLE-DATE GS_MSGTABLE-TIME into GV_DATUM.
SELECT RES_CONTENT, REQ_CONTENT
FROM zif_log_content
INTO @GS_MSG_STRUKT
WHERE TIMESTAMP >= @Gv_date AND TIMESTAMP <= @Gv_date.
ENDSELECT.
ENDSELECT.
这行不通,因为 SAP 中的 TIMESTAMP 是十进制类型,不等于日期和时间的串联。
您应该使用以下句子创建时间戳。
CONVERT DATE gs_msgtable-date TIME gs_msgtable-time INTO TIME STAMP DATA(gv_timestamp) TIME ZONE sy-zonlo.
还要注意时区。我不知道您在 Z-table 中输入的是哪个时区。在 BAL table 中,它们应该存储在 UTC 中。之前一定要检查一下。
连接有效,您只需将时间戳传递到您的 SELECT,而不是字符串。
这是一个基于标准 BALHDR
和 MBEW
表的工作简化示例:
TYPES: BEGIN OF struct,
lognumber TYPE balhdr-lognumber,
aldate TYPE balhdr-aldate,
altime TYPE balhdr-altime,
timestamp TYPE mbew-timestamp,
END OF struct.
DATA: gs_msg_strukt TYPE struct.
DATA: gt_msg_strukt TYPE TABLE OF struct.
SELECT *
FROM balhdr
INTO CORRESPONDING FIELDS OF @gs_msg_strukt
WHERE aldate >= @gv_input_dateto AND altime <= @gv_input_timeto.
CONCATENATE gs_msg_strukt-aldate gs_msg_strukt-altime INTO gv_datum.
DATA(gv_date) = CONV timestamp( gv_datum ).
SELECT timestamp
FROM mbew
INTO CORRESPONDING FIELDS OF @gs_msg_strukt
WHERE timestamp >= @gv_date AND timestamp <= @gv_date.
ENDSELECT.
APPEND gs_msg_strukt TO gt_msg_strukt. "<---move APPEND here
ENDSELECT.
问题
我还没有一个完全可用的最小示例,但我可以为您提供两个 table 的示例,我想将它们结合在一起。第三个 table 显示了想要的结果。谢谢
-----------------------------------------------------------------------------
BALHDR
----------------------------------------------------------------------------
| EXTNUMBER| DATE | TIME |OBJECT|SUBOBJECT| USER|MSG_ALL |MSG_ERROR
|---------------------------------------------------------------------------
A| 1236 |2000.10.10 |12:33:24 |KAT |LEK |NEK | NULL | NULL
B| 1936 |2010.02.20 |02:33:44 |KAT |MOK |NEK | 3 | 1
C| 1466 |2010.10.10 |11:35:34 |KAT |LEK |NEK | 2 | 0
D| 1156 |2011.08.03 |02:13:14 |KAT |MOK |NEK | 3 | 0
E| 1466 |2014.10.10 |11:35:34 |KAT |LEK |NEK | NULL | NULL
F| 1156 |2019.08.03 |02:13:14 |KAT |MOK |NEK | 1 | 1
----------------------------------------------------------------------------
ZIF_LOG
-----------------------------------------------------------------------------
| TIMESTAMP | REQ | RES
|---------------------------------------------------------------------------
1| 20100220023344 | he |hello
2| 20101010113534 | bla |blala
3| 20110803021314 | to |toto
4| 20190803021314 | macs |ka
下面的table显示了想要的结果。 1 到 4 的数字和 A 到 F 的字母有助于理解字段之间的对应关系。
-----------------------------------------------------------------------------
WANTED RESULT TABLE
----------------------------------------------------------------------------
|EXTNUMBER| DATE | TIME |OBJECT|SUBOBJECT | USER| REQ | RES
----------------------------------------------------------------------------
A| 1236 |2000.10.10 |12:33:24 |KAT |LEK |NEK | NULL | NULL
B2| 1936 |2010.02.20 |02:33:44 |KAT |MOK |NEK | he | hello
E | 1466 |2014.10.10 |11:35:34 |KAT |LEK |NEK | NULL | NULL
F6| 1156 |2019.08.03 |02:13:14 |KAT |MOK |NEK | macs | ka
谢谢
我应该从两个日志 table 中检索数据(BALHDR
和 ZIF_LOG_XML_CONTENT
)。我的问题是日志 tables 之间的唯一共同点是创建条目的时间。查询必须针对 PERIOD 而不是 TIME POINT 有效。
但是,条目的时间在两个 table 中存储的格式不同。在 ZIF_LOG_XML_CONTENT
中它存储在一列中 TIMESTAMP
在另一个日志中 table 在 BALHDR
中它存储在两列中,其中 DATE
和 TIME
分开存放。
我一直试图转换成STRING
,但还是不行...
我做错了什么?
DATA: GV_DATEANDTIMETO TYPE STRING,
GV_DATETO TYPE STRING,
GV_TIMETO TYPE STRING,
GV_DATEANDTIMEFROM TYPE STRING,
GV_DATEFROM TYPE STRING,
GV_TIMEFROM TYPE STRING,
GV_DATUM TYPE STRING.
SELECT * FROM BALHDR INTO @GS_MSG_STRUKT WHERE
EXTNUMBER = @P_EXTID AND
OBJECT = @P_OBJ AND
SUBOBJECT = @P_SUBOBJ AND
ALUSER = @P_USER AND
( ALDATE_BALHDR >= @GV_INPUT_DATETO AND ALTIME_BALHDR >= @GV__INPUT_TIMETO ) AND
( ALDATE_BALHDR <= @GV_INPUT_DATEFROM AND ALTIME_BALHDR <= @GV__INPUT_TIMEFROM ) AND
MSG_CNT_E >= 1 OR MSG_CNT_AL IS ZERO.
concatenate GS_MSGTABLE-DATE GS_MSGTABLE-TIME into GV_DATUM.
SELECT RES_CONTENT, REQ_CONTENT
FROM zif_log_content
INTO @GS_MSG_STRUKT
WHERE TIMESTAMP >= @Gv_date AND TIMESTAMP <= @Gv_date.
ENDSELECT.
ENDSELECT.
这行不通,因为 SAP 中的 TIMESTAMP 是十进制类型,不等于日期和时间的串联。
您应该使用以下句子创建时间戳。
CONVERT DATE gs_msgtable-date TIME gs_msgtable-time INTO TIME STAMP DATA(gv_timestamp) TIME ZONE sy-zonlo.
还要注意时区。我不知道您在 Z-table 中输入的是哪个时区。在 BAL table 中,它们应该存储在 UTC 中。之前一定要检查一下。
连接有效,您只需将时间戳传递到您的 SELECT,而不是字符串。
这是一个基于标准 BALHDR
和 MBEW
表的工作简化示例:
TYPES: BEGIN OF struct,
lognumber TYPE balhdr-lognumber,
aldate TYPE balhdr-aldate,
altime TYPE balhdr-altime,
timestamp TYPE mbew-timestamp,
END OF struct.
DATA: gs_msg_strukt TYPE struct.
DATA: gt_msg_strukt TYPE TABLE OF struct.
SELECT *
FROM balhdr
INTO CORRESPONDING FIELDS OF @gs_msg_strukt
WHERE aldate >= @gv_input_dateto AND altime <= @gv_input_timeto.
CONCATENATE gs_msg_strukt-aldate gs_msg_strukt-altime INTO gv_datum.
DATA(gv_date) = CONV timestamp( gv_datum ).
SELECT timestamp
FROM mbew
INTO CORRESPONDING FIELDS OF @gs_msg_strukt
WHERE timestamp >= @gv_date AND timestamp <= @gv_date.
ENDSELECT.
APPEND gs_msg_strukt TO gt_msg_strukt. "<---move APPEND here
ENDSELECT.
问题
我还没有一个完全可用的最小示例,但我可以为您提供两个 table 的示例,我想将它们结合在一起。第三个 table 显示了想要的结果。谢谢
-----------------------------------------------------------------------------
BALHDR
----------------------------------------------------------------------------
| EXTNUMBER| DATE | TIME |OBJECT|SUBOBJECT| USER|MSG_ALL |MSG_ERROR
|---------------------------------------------------------------------------
A| 1236 |2000.10.10 |12:33:24 |KAT |LEK |NEK | NULL | NULL
B| 1936 |2010.02.20 |02:33:44 |KAT |MOK |NEK | 3 | 1
C| 1466 |2010.10.10 |11:35:34 |KAT |LEK |NEK | 2 | 0
D| 1156 |2011.08.03 |02:13:14 |KAT |MOK |NEK | 3 | 0
E| 1466 |2014.10.10 |11:35:34 |KAT |LEK |NEK | NULL | NULL
F| 1156 |2019.08.03 |02:13:14 |KAT |MOK |NEK | 1 | 1
----------------------------------------------------------------------------
ZIF_LOG
-----------------------------------------------------------------------------
| TIMESTAMP | REQ | RES
|---------------------------------------------------------------------------
1| 20100220023344 | he |hello
2| 20101010113534 | bla |blala
3| 20110803021314 | to |toto
4| 20190803021314 | macs |ka
下面的table显示了想要的结果。 1 到 4 的数字和 A 到 F 的字母有助于理解字段之间的对应关系。
-----------------------------------------------------------------------------
WANTED RESULT TABLE
----------------------------------------------------------------------------
|EXTNUMBER| DATE | TIME |OBJECT|SUBOBJECT | USER| REQ | RES
----------------------------------------------------------------------------
A| 1236 |2000.10.10 |12:33:24 |KAT |LEK |NEK | NULL | NULL
B2| 1936 |2010.02.20 |02:33:44 |KAT |MOK |NEK | he | hello
E | 1466 |2014.10.10 |11:35:34 |KAT |LEK |NEK | NULL | NULL
F6| 1156 |2019.08.03 |02:13:14 |KAT |MOK |NEK | macs | ka
谢谢