在Oracle/H2中以标准方式规范化或设置SQL时间戳

在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 <

我在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.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