代码之家  ›  专栏  ›  技术社区  ›  Luca

使用groovy:update timestamp oracle列

  •  1
  • Luca  · 技术社区  · 6 年前

    我有两个groovy脚本,分别对一个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
    

    在第二个脚本中,我使用这个groovy代码段(我省略了连接到数据库的代码段代码)对同一行进行更新:

    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 回复  |  直到 6 年前
        1
  •  0
  •   Littlefoot    6 年前

    为了您自己的利益,在创建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>