使用groovy:更新时间戳Oracle列

时间:2018-07-20 08:02:17

标签: oracle groovy timestamp groovy-sql ora-01843

我有两个groovy脚本,分别在具有字符串列和两个timestamp列的oracle表上进行插入和更新,如下所示:

CREATE TABLE sn_token (
    "token" varchar2(500 char) NOT NULL,
    created_at timestamp NOT NULL,
    updated_at timestamp,
    PRIMARY KEY ("token")
);

在第一个groovy脚本中,我使用该groovy代码段在此表上进行插入(我省略了用于建立与数据库连接的代码段):

import java.util.Date;
import org.joda.time.DateTime;

DateTime now = DateTime.now()
Date date = now.toDate()
def createdTimestamp = date.toTimestamp()
def map = [token : "myToken", created_at : createdTimestamp]
sql.execute "INSERT INTO sn_token (\"token\", created_at) VALUES ($map.token, $map.created_at)"

就可以了,存储到控制台的时间戳记是:

2018-07-20 09:38:24.191

在第二个脚本中,我使用此常规代码段在同一行上进行更新(我省略了用于建立与数据库连接的代码段):

import java.util.Date;
import org.joda.time.DateTime;

DateTime now = DateTime.now()
Date date = now.toDate()
def updatedTimestamp = date.toTimestamp()
def myToken = "myToken"
sql.execute 'UPDATE sn_token SET updated_at = \'' + updatedTimestamp + '\' WHERE "token" = \'' + myToken + '\''

登录到控制台的UpdatedTimestamp变量的值为:

2018-07-20 09:40:44.706

,生成的查询为:

UPDATE sn_token SET updated_at = '2018-07-20 09:40:44.706' WHERE "token" = "myToken"

尽管两个时间戳变量具有相同的格式,但更新sql返回错误

ORA-01843: not a valid month

我不明白为什么。

有人可以帮我解决这个问题吗?

谢谢

1 个答案:

答案 0 :(得分:0)

为您自己,在创建Oracle对象时,请避免使用双引号。默认情况下,它们将以大写形式创建,但是您可以随意引用(大​​写,小写,大小写混合)。如果您坚持将列创建为"token",则必须始终以这种方式引用它(双引号,小写名称)。


关于您的问题:看看TO_TIMESTAMP是否解决了问题。这是一个示例:

SQL> create table sn_token
  2    (token      varchar2(10),
  3     updated_at timestamp
  4    );

Table created.

SQL>
SQL> insert into sn_token (token) values (1);

1 row created.

SQL> update sn_token set
  2    updated_at = to_timestamp('2018-07-20 09:40:44.706', 'yyyy-mm-dd hh24:mi:ss.ff3');

1 row updated.

SQL> select * from sn_token;

TOKEN      UPDATED_AT
---------- ------------------------------
1          20.07.18 09:40:44,706000

SQL>