SAP HANA SQL如何将CreateTS UpdateTS CreareTime UpdateTime转换为timestampdate

时间:2018-12-04 15:42:47

标签: sql sap hana

我打算将CreateDate和CreateTS合并为一个包含日期和时间的时间戳记

现在我唯一达到的解决方案是

SELECT 
    TO_TIMESTAMP(
        to_char(COALESCE("UpdateDate","CreateDate",'1970-01-01'), 'yyyy-mm-dd') || ' '||
        SUBSTRING (lpad(COALESCE("UpdateTS","CreateTS",0),6,'0'),0,2) || ':'||
        SUBSTRING (lpad(COALESCE("UpdateTS","CreateTS",0),6,'0'),3,2)|| ':'||
        SUBSTRING (lpad(COALESCE("UpdateTS","CreateTS",0),6,'0'),5,2), 'YYYY-MM-DD HH24:MI:SS'
    )  AS update_create
FROM OCRD

但是我发现对于UpdateTime列,此代码无法正常工作。 sap的最大问题是sap将日期与时间分开,并以不同的格式保存时间,因此:

8 -> it's 00:08:00 and not 00:00:08
223 -> it's 22:30:00 andf bnot 00:02:23
16321 -> it's 01:63:21

是否有任何已定义的函数来关联日期和时间以获得创建/更新的真正意义?

谢谢

2 个答案:

答案 0 :(得分:0)

如果您的列"UpdateDate","CreateDate"以日期存储,列"UpdateTS","CreateTS"以HHMMSS格式存储,则可以尝试以下操作:

TO_TIMESTAMP( COALESCE("UpdateDate","CreateDate",'1970-01-01') || ' ' || TO_TIME(COALESCE("UpdateTS","CreateTS",000000)) )

答案 1 :(得分:0)

“ UpdateDate”和“ CreateDate”作为日期存储在SAP HANA中,并保留年,月,日和00:00:00.000作为时间。

“ CreateTS”和“ UpdateTS”仅将时间以hhmmss格式存储为int。这意味着14:34:06存储为143406。作为整数,前导零不存储

对我有用的连接日期和时间的方法是为日期(格式YYYYMMDD)创建一个varchar,为时间添加前导零创建一个varchar。然后,使用日期和时间创建一个时间戳。

解决方案:

TO_TIMESTAMP(TO_VARCHAR(COALESCE("UpdateDate","CreateDate",'19700101'), 'YYYYMMDD') || ' ' || LPAD(COALESCE("UpdateTS","CreateTS",0),6,0),'YYYYMMDD HH24MISS')

您可以创建一个函数来简化此操作:

CREATE FUNCTION TO_DATETIME(vDATE DATE, vTime INT)
RETURNS DT TIMESTAMP
AS
BEGIN
    DT := TO_TIMESTAMP(TO_VARCHAR(:vDATE, 'YYYYMMDD') || LPAD(:vTIME,6,'0'), 'YYYYMMDDHH24MISS');
END;

然后只使用它:SELECT "UpdateDate", "UpdateTS", TO_DATETIME("UpdateDate", "UpdateTS") as "UpdateDateTime" FROM OCRD