SAP HANA SQL如何将日期和时间转换为时间戳

3

我正在尝试将CreateDateCreateTS列连接起来,以创建一个包含日期和时间的时间戳。

目前我想到的唯一解决方案是:

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 列,这段代码无法正常工作。 最大的问题在于日期和时间是不同的列,并且保存的时间格式也不同:
  • 8:它表示的是 00:08:00 而不是 00:00:08
  • 223:它表示的是 22:30:00 而不是 00:02:23
  • 16321:它表示的是 01:63:21
是否有任何已经定义好的函数可以将日期和时间拼接起来获取实际的创建/更新时间戳?
谢谢。
2个回答

3
"SAP HANA中的“UpdateDate”和“CreateDate”以日期形式存储,保留年、月、日和00:00:00.000的时间信息。而“CreateTS”和“UpdateTS”仅以hhmmss格式的整数形式存储时间信息,意味着14:34:06被存储为143406。作为整数类型,前导零未被存储。我使用的连接日期和时间的方法是创建一个格式为YYYYMMDD的varchar类型的日期,并添加前导零的varchar类型的时间,然后使用日期和时间创建一个TimeStamp。"
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

编辑:有时候CreateTS或UpdateTS存储为HHMM而不是HHMMSS。在这种情况下要小心,可以通过在右侧用“00”进行填充或创建一个新函数来处理。


0
如果您的列 "UpdateDate","CreateDate" 存储为日期,而列 "UpdateTS","CreateTS" 以 HHMMSS 格式存储,则可以尝试以下操作:
TO_TIMESTAMP( COALESCE("UpdateDate","CreateDate",'1970-01-01') || ' ' || TO_TIME(COALESCE("UpdateTS","CreateTS",000000)) )

嗨@Konrad,它以HHMM格式存储为整数,这意味着1 = 00:01,正如我在问题中所描述的那样,TO_TIME将把它转换为01:00。 - Sano
但是在你的例子中,你给出了16321 -> 它是01:63:21。所以这不是HHMM格式。如果223 => 22:30,那么它是如何存储02:23的? - Konrad Z.
我认为问题在于UpdateTime列使用HHMMSS格式,但数字10表示10秒,而UpdateTS列中的值10表示10分钟。 - Sano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接