2015-05-27 6 views
0

Я получаю SqlException на PreparedStatement за нарушение ограничения уникальности на таблице (ключ обмана). По существу моя таблица выглядит следующим образом:java.util.Date to java.sql.Date не содержит времени

mytable 
======= 
mytable_id  PRIMARY KEY INT NOT NULL 
fizz_id   INT NOT NULL 
buzz_timestamp DATETIME 

Уникальность ограничение на buzz_timestamp; то есть, никакие 2 записи не могут иметь одну и ту же дату/время «метка времени».

PreparedStatement, который вставляет записи в эту таблицу выглядит следующим образом:

PreparedStatement ps = conn.prepareStatement(insertQuery); 
ps.setDate(1, new java.sql.Date(new java.util.Date().getTime())); 

Таким образом, вы можете видеть, что я везу java.util.Date() («сейчас») и преобразования его в java.sql.Date инстанции.

Точная ошибка, которую я вижу (ключ обмана), продолжает жаловаться на то, что я пытаюсь вставить 2015-05-27 00:00:00.0000000 в таблицу для buzz_timestamp, но она уже существует. Таким образом, очевидно, что я неправильно использую API Date, и я вставляю даты, у которых есть нулевые компоненты времени, и тем самым производятся исключения для исключения дублирования.

Так что я спрашиваю: Как исправить это, чтобы я действительно вставлял дату и время для «сейчас»?

+1

Проверить этот вопрос: http://stackoverflow.com/questions/6777810/a-datetime-equivalent-in-java-sql-is-there-a-java-sql-datetime – iouhammi

+1

Если вы используя Java 8, перейдите в [java.time.LocalDateTime] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html) вместо [java.util.Date] (https://docs.oracle.com/javase/7/docs/api/java/util/Date.html) – Arrigo

ответ

1

java.sql.Date расширяет java.util.Date, но работает по-другому: В SQL DATE нет времени. Поэтому объект Java также игнорирует часы, минуты и т. Д.

Попробуйте java.sql.Timestamp, но вам может понадобиться актерский состав (в SQL), чтобы преобразовать его в DATETIME.

Похожие:

0

Вместо SETDATE вам нужно попробовать setTimestamp

java.sql.Date - A date only (no time part) 
java.sql.Time - A time only (no date part) 
java.sql.Timestamp - Both date and time 
0

accepted answer правильно. Я добавлю объяснение.

Смешение Hack

В SQL, дата является датой только значение не хватает времени-в-день или часового пояса.

В беспорядок, который является старыми классами времени, в комплекте с Java, отсутствует такой класс, чтобы представлять значения только для даты.

Вместо этого команда Java создала хак. Они создали java.sql.Date, расширив java.util.Date, который, несмотря на запутанное имя, имеет дату и часть времени дня. Для подкласса, ориентированного на SQL, они устанавливают значение времени дня равным нулю. Вы можете подумать об этом как о «полночь». Таким образом, java.sql.Date имеет время суток, но притворяется, что это не так.

Цитирует java.SQL.Date документ:

в соответствие с определением SQL DATE значение миллисекунды, завернутое экземпляром java.sql.Date должно быть «нормализовано», установив часы, минуты, секунды , и миллисекунды до нуля в конкретном часовом поясе, с которым связан экземпляр.

Для значения даты и времени в-SQL использовать java.sql.Timestamp класс, как показано в accepted answer.

java.time

Эти плохо спроектированные классы даты и времени были вытеснены новой java.time пакета, встроенного в Java 8 и более поздних версий. Этот пакет был вдохновлен библиотекой Joda-Time.

Пакет Java.time включает классы для представления только для дат и классов времени. В конце концов драйверы JDBC будут обновлены для непосредственной поддержки новых типов данных. До тех пор используйте несколько методов преобразования, добавленных в старый и новый классы. Найдите StackOverflow.com для многих примеров и обсуждений, так как этот вопрос в основном дублируется.

Смежные вопросы