Использование groovy: обновить метку времени

У меня есть два скрипта groovy, которые делают соответственно вставку и обновление таблицы оракула, в которой есть строковый столбец и два столбца отметки времени, созданные следующим образом:

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 ответ

Решение

Ради себя, избавьтесь от двойных кавычек при создании объектов 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>
Другие вопросы по тегам