Unix时间戳到oracle时间戳

时间:2014-12-14 06:08:18

标签: oracle timestamp unix-timestamp

我正在使用Oracle Express 11g。

我有一个名为rm_pedidos的表,其中有一个名为'fechacreacion'的列,声明为timestamp(0)[因此毫秒部分未存储]

我在那张桌子上有一张记录,其表格是(在unix时间,它是我插入的那张):1418533255000(即2014年12月13日星期六23:00:55.000000000 GMT-0600(CST))

此查询有效(它返回该行):

select * from rm_pedidos where fechacreacion = (timestamp '1970-01-01 00:00:00 +00:00' + numtodsinterval(1418533255000/1000,'second')) 

所以我想,让我们创建一个函数:

create or replace function to_ts(p_millis in number) return timestamp is
begin
  return timestamp '1970-01-01 00:00:00 +00:00' + numtodsinterval(p_millis/1000,'second');
end;

我测试了它:

select to_ts(1418533255000) from dual

它返回(在SQLDeveloper中显示):14/12/14 05:00:55.000000000(很好,它在GMT + 0,这与2014年12月13日星期六23:00:55 GMT-0600相同)

但是当我在查询中使用它时:

select * from rm_pedidos where fechacreacion = to_ts(1418533255000)

没有返回任何行。

你能解释一下发生了什么吗?我的功能有问题吗?

提前致谢, 拉嘎


附加信息

我刚做了这个测试(在SqlDeveloper上):

select to_ts(1418533255000) from dual;

显示:14/12/14 05:00:55.000000000

但是这句话:

select timestamp '1970-01-01 00:00:00 +00:00' + numtodsinterval(1418533255000/1000,'second') from dual;

显示:14/12/14 05:00:55.000000000 +00:00

区别:to_ts(...)返回的这个时间戳不带tz信息(所以我猜它假设当地时区... 14/12/14 05:00:55.000000000 -06:00。< / p>

如何实现to_ts(...)以便它返回带有tz信息的时间戳(在这种情况下,我想要+00:00作为tz)?

谢谢!


更多其他信息

我甚至尝试过这个acrobat只是为了得到to_ts返回的值带有tz信息....还是,没有运气:

create or replace function to_ts(p_millis in number)
return timestamp is
begin
  return TO_TIMESTAMP_TZ(
    concat(
      to_char(timestamp '1970-01-01 00:00:00 +00:00' + numtodsinterval(p_millis/1000,'second'), 'YYYY-MM-DD HH24:MI:SS'), 
      ' +00:00'
    ),
    'YYYY-MM-DD HH24:MI:SS +TZH:TZM'
  );
end;

“从双重选择to_ts(1418533255000);”仍然显示14/12/14 05:00:55.000000000 ...和“select * from rm_pedidos,其中fechacreacion = to_ts(1418533255000)”仍然没有返回记录。


附加说明(当前的研究报告)

我刚刚发现......这个查询有效:

select * from rm_pedidos where fechacreacion = from_tz(to_ts(1418533255000), '0:00');

所以..,我必须从to_ts的返回值调用from_tz(...虽然很奇怪,但是在函数to_ts中执行此操作不起作用)。

真的,oracle?


好的:最后......(这是我的坏事)。这个工作(我应该将返回类型声明为'带时区的时间戳':

create or replace function to_ts(p_millis in number) return TIMESTAMP WITH TIME ZONE is
begin
  return timestamp '1970-01-01 00:00:00 +00:00' + numtodsinterval(p_millis/1000,'second');
end;

这样,这个简单的查询就可以了:

select * from rm_pedidos where fechacreacion = to_ts(1418533255000);

这些查询也是如此:

select * from rm_pedidos where fechacreacion < to_ts(1418533255001);
select * from rm_pedidos where fechacreacion > to_ts(1418533254999);

0 个答案:

没有答案