我正在使用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);