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中存在,您将始终获得输出。更新了代码