在Oracle/H2中以标准方式规范化或设置SQL时间戳
我在Oracle中有一个foosql表,它有一个bar时间戳。我想更新时间戳,以便它们在8–16秒的范围内匹配最大时间戳。不管怎样,时间戳都是成束的;它们之间的间隔不到8秒,或者超过16秒。哦,我正在用H2进行测试。我试过这个:在Oracle/H2中以标准方式规范化或设置SQL时间戳,sql,oracle,timestamp,h2,Sql,Oracle,Timestamp,H2,我在Oracle中有一个foosql表,它有一个bar时间戳。我想更新时间戳,以便它们在8–16秒的范围内匹配最大时间戳。不管怎样,时间戳都是成束的;它们之间的间隔不到8秒,或者超过16秒。哦,我正在用H2进行测试。我试过这个: UPDATE foo update_foo SET bar = (SELECT MAX(bar) FROM foo WHERE bar > update_foo.bar - interval '8' second AND bar <
UPDATE foo update_foo SET bar =
(SELECT MAX(bar) FROM foo
WHERE bar > update_foo.bar - interval '8' second
AND bar < update_foo.bar + interval '8' second)
我不喜欢那样。如果我想以标准的方式使用Oracle,我的语法是否正确?是H2有问题,还是我的语法有问题?或者有更好的方法吗?是H2。您的语句符合Oracle 12c的要求,最早是在10g?引入时间戳时 更好的方法取决于H2,我不知道 编辑:您可以查看更多详细信息 一个蛮力的方法,应该是相当缓慢的,将打开一个光标进行搜索
select key, max(bar) from foo group by key
在循环中,获取一行并执行以下操作:
update foo set bar = max_fetched_bar where key = fetched_key
太可怕了。太可怕了。但也许更新和选择足够简单,可以在H2中解析
如果H2支持执行匿名PL/SQL块,那么您可以在PL/SQL块中执行原始更新,并希望避免H2。我喜欢H2,但它必然不同于Oracle。在这种情况下,这个小小的数据库引擎出于同样的目的使用了另一种语法。但我警告你,这不是甲骨文的抄袭 假设您的数据是:
create table foo (
bar timestamp
);
insert into foo (bar) values ('2018-01-01 12:34:56');
insert into foo (bar) values ('2018-01-01 12:34:52');
insert into foo (bar) values ('2018-01-01 12:34:57');
insert into foo (bar) values ('2018-01-02 12:34:10');
insert into foo (bar) values ('2018-01-02 12:34:11');
查询是:
update foo update_foo set bar =
(select max(bar) from foo
where bar > dateadd('second', -8, update_foo.bar)
and bar < dateadd('second', 8, update_foo.bar)
);
BAR
---------------------
2018-01-01 12:34:57.0
2018-01-01 12:34:57.0
2018-01-01 12:34:57.0
2018-01-02 12:34:11.0
2018-01-02 12:34:11.0