我有两个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
我不明白为什么。
有人可以帮我解决这个问题吗?
谢谢
答案 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>