Abap 按时间戳和日期列联接表?
我应该从两个日志表中检索数据(Abap 按时间戳和日期列联接表?,abap,opensql,Abap,Opensql,我应该从两个日志表中检索数据(BALHDR和ZIF\u log\u XML\u CONTENT)。我的问题是,日志表之间唯一的共同点是创建条目的时间。查询必须工作一段时间,而不是一个时间点 但是,两个表中的条目时间存储格式不同。在ZIF_LOG\u XML_CONTENT中,它存储在BALHDR的另一个日志表中的一列TIMESTAMP中,它存储在两列中,其中DATE和TIME分别存储 我一直试图转换为字符串,但仍然无法工作 我做错了什么 DATA: GV_DATEANDTIMETO TYPE S
BALHDR
和ZIF\u log\u XML\u CONTENT
)。我的问题是,日志表之间唯一的共同点是创建条目的时间。查询必须工作一段时间,而不是一个时间点
但是,两个表中的条目时间存储格式不同。在ZIF_LOG\u XML_CONTENT
中,它存储在BALHDR
的另一个日志表中的一列TIMESTAMP
中,它存储在两列中,其中DATE
和TIME
分别存储
我一直试图转换为字符串
,但仍然无法工作
我做错了什么
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.
DATA:GV_DATEANDTIMETO-TYPE字符串,
GV_DATETO类型字符串,
GV_TIMETO类型字符串,
GV_DATEANDTIMEFROM类型字符串,
GV_DATEFROM类型字符串,
GV_TIMEFROM类型字符串,
GV_基准类型字符串。
选择*从BALHDR进入@GS\U MSG\U STRUKT,其中
EXTNUMBER=@P_EXTID和
OBJECT=@P_OBJ和
SUBOBJECT=@P_SUBOBJECT和
ALUSER=@P_用户和
(ALDATE\U BALHDR>=@GV\U INPUT\U DATETO和ALTIME\U BALHDR>=@GV\U INPUT\U TIMETO)和
(ALDATE_BALHDR=@Gv_date AND TIMESTAMP这不起作用,因为SAP中的时间戳是十进制类型,不等于以任何方式连接日期和时间
您应该使用以下句子创建时间戳
CONVERT DATE gs_msgtable-date TIME gs_msgtable-time INTO TIME STAMP DATA(gv_timestamp) TIME ZONE sy-zonlo.
还要注意时区。我不知道Z表中的条目在哪个时区。在BAL表中,它们应该以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.
类型:结构的开头,
日志号类型balhdr日志号,
aldate型balhdr aldate,
高度表类型balhdr高度表,
时间戳类型mbew时间戳,
结构的末尾。
数据:gs\u msg\u strukt类型结构。
数据:结构的gt\U msg\U strukt类型表。
挑选*
来自巴尔德
进入@gs\u msg\u strukt的相应字段
其中,aldate>=@gv\U input\U dateto和altime=@gv\U date和timestamp问题
我还没有一个完全有效的最小示例,但我可以给你们一个两个表的示例,我想把它们连接在一起。第三个表显示了想要的结果。THX
-----------------------------------------------------------------------------
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
下表显示了所需的结果。从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
THX这不起作用,因为SAP中的时间戳是十进制类型,不等于以任何方式连接日期和时间。除了你的问题之外,还有一点关于你的代码的备注:在你使用SELECT
…ENDSELECT
的方式中,此表单已过时,你应该只使用连接执行一个SELECT
。我是sry,但我是r在abap世界里,这是一个全新的概念。我试图再次解释我的问题。我应该比较balhdr~日期和balhdr~时间(它们是两列)为zif_log_content~用户定义间隔的时间戳列。从balhdr中,我必须选择EXTNUMBER、DATE、TIME对象、SUBOBJECT、ALUSER、MSG_COUNT_ALL、MSG_COUNT_ERROR,同时从第二个表中,间隔应该有两列,RESPONSE_MSG和REQUEST_MSG。我的选择应该是这样做的。你能帮我找到吗创建并编写此文件?嗨,Sandra,它在哪里被标记为过时?这是一种完美的方法,可以在不使用打开游标的情况下执行打开游标
。您使用什么版本的ABAP和DBMS?对于7.4及以上版本,您可以为类创建AMDP方法,并在这里执行所有SQL操作,而不受兼容性限制(如匹配类型等):在SQL中,您几乎可以强制转换任何内容。我遇到了一个语法错误:GS_MSGTABLE的组件日期的数据类型与Resu内容的数据类型不兼容。很难说,如果您没有一个可复制的示例,但我猜您的投影resu CONTENT,REQ_CONTENT
,因为我没有使用RS\u CONTENT
在我的转换中没有任何方式使用。在balhdr
表中也没有aldate\u balhdr
字段,您可能使用了一些奇怪的视图。这就是为什么在标准表中重现您的问题总是很有用的原因,这样其他人就更有可能帮助您Hi Suncatcher,感谢您的示例。这是almost完美,但我仍然有一个问题。即使在mbew中没有针对所选时间戳的条目,我仍然希望列出balhrd表中的所有条目。以您的示例为例,如果没有对应的条目是mbew表,那么我就没有任何一个表的输出形式。您能帮我解决这个问题吗?非常感谢!只是m从ENDSELECT中删除APPEND,如果BALHDR中存在,您将始终获得输出。更新了代码