Формат даты и времени в Oracle - PullRequest
0 голосов
/ 12 апреля 2020

Я новичок в sql и работаю над примером. Среди таблиц, которые я создал, у меня есть таблица комментариев:

CREATE TABLE comments (
club       VARCHAR2(60) NOT NULL,
nick         VARCHAR2(35),
msg_date   DATE,
title        VARCHAR2(100) NOT NULL,
director   VARCHAR2(50) NOT NULL,
subject    VARCHAR2(100),
message    VARCHAR2(1500),
valoration NUMBER(2),
CONSTRAINT PK_COMMENTS PRIMARY KEY (nick,msg_date),
CONSTRAINT FK_COMMENTS_MEMBER FOREIGN KEY (nick,club) REFERENCES membership ON DELETE CASCADE,
CONSTRAINT FK_COMMENTS_MOVIES  FOREIGN KEY (title,director) REFERENCES movies,
CONSTRAINT CK_COMMENTS_VAL CHECK (valoration<11) 
);

Меня просят создать триггер, который выполняет следующее: если комментарий приходит в тот же день, что и другой, уже сохраненный, зарегистрируйте его с датой «одна секунда спустя». У меня проблема в том, что я не знаю, как преобразовать «одну секунду» позже в дату. Есть идеи, как решить эту проблему?

1 Ответ

1 голос
/ 12 апреля 2020

msg_date + интервал '1' секунд

или альтернативно msg_date + (1 / (24 * 60 * 60))

Однако весь этот сценарий чреват опасностью. При проверке существующих сообщений в таблице внутри триггера таблица может изменяться в других транзакциях, поэтому здесь существует реальный риск возникновения условий гонки - два сообщения, добавляющие 1 секунду к существующему сообщению, будут иметь одинаковую дату. Это было бы в случае, если проверка была в триггере или код приложения.

Если это сценарий реального мира, я бы избегал триггера, используя временную метку, а не дату, где точность составляет от миллис до нанос, и подумал, как справиться с меньшим риском сообщений с такой же временной меткой, как бизнес-проблема - в чем смысл, если она возникает.

...