在Oracle SQL中将时间戳转换为Unix纪元时间

时间:2019-07-01 15:07:38

标签: sql oracle plsql

我在Oracle中有一个2000万条记录的表,其datetime(列之一)列为VARCHAR类型,在EST时区中。我正在尝试创建一个将datetime转换为Unix纪元时间的新列,但它给我抛出了一个错误。

create function unix_timestamp(pi_date date) return number is
    c_base_date constant date := to_date('1970-01-01 00:00:00', 'YYYY-MM-DD HH:MM:SS');
    c_seconds_in_day constant number := 24 * 60 * 60;
    v_unix_timestamp number;
begin
    v_unix_timestamp := trunc((pi_date - c_base_date) * c_seconds_in_day);

    if (v_unix_timestamp < 0 ) then
        raise_application_error(-20000, 'unix_timestamp:: unix_timestamp cannot be nagative');
    end if;

    return v_unix_timestamp;
end unix_timestamp;

这是我创建的函数,当我尝试调用此函数时,它向我抛出一条错误消息:

ORA-01861: literal does not match format string
01861. 00000 -  "literal does not match format string"
*Cause:    Literals in the input must be the same length as literals in
           the format string (with the exception of leading whitespace).  If the
           "FX" modifier has been toggled on, the literal must match exactly,
           with no extra whitespace.
*Action:   Correct the format string to match the literal.

我可以得到一些帮助吗?

1 个答案:

答案 0 :(得分:0)

代码行

c_base_date constant date := to_date('1970-01-01 00:00:00', 'YYYY-MM-DD HH:MM:SS');

小时和分钟格式代码错误;尝试

c_base_date constant date := to_date('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');

MI持续数分钟(我忘记了我所数不胜数的次数),并以小时格式(HH24)包含24次。并查看MathGuy对时区的评论和对date数据类型的评论,其中不包括时区信息。