Подготовленное заявление JDBC. setDate (…) не экономит время, просто дату .. Как я могу сэкономить время?

У меня есть следующий запрос:

INSERT INTO users (user_id, date_created) VALUES (?,?) 

У меня есть следующее подготовленное заявление

 PreparedStatement insertUser = dbConnection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); insertUser.setInt(1, 7); java.util.Date now = new java.util.Date(System.currentTimeMillis()); insertUser.setDate(2, new java.sql.Date((new Date(System.currentTimeMillis())).getTime())); insertUser.executeUpdate(); 

Если я проверю базу данных, я обнаружил, что она вставляет только сегодняшнюю дату, а не время, так что это будет: 2011-07-29 00:00:00

Что мне следует добавить в setDate() чтобы получить время?

Вместо Date вы должны использовать метод Timestamp и setTimestamp .

вы должны сделать что-то вроде этого:

 private static java.sql.Timestamp getCurrentTimeStamp() { java.util.Date today = new java.util.Date(); return new java.sql.Timestamp(today.getTime()); } 

….

 preparedStatement.setTimestamp(4,getCurrentTimeStamp()); 

Java-тип java.sql.Date будет нормализован, чтобы представлять только java.sql.Date SQL DATE а не момент времени. Из документации API:

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

Нормализация объясняет, почему вы видите 00:00:00 как время.

Если вы хотите сохранить информацию о времени, подумайте об использовании classа Timestamp, который может представлять как дату, так и время.

Очевидно, что вы должны также использовать соответствующие типы SQL для определения вашей структуры таблицы; если вы хотите сохранить временные метки в базе данных, используйте тип SQL, предпочитаемый вашей базой данных. Хотя некоторые базы данных и их драйверы JDBC позволяют хранить метки времени в столбцах DATE , рекомендуется использовать эквивалент типа SQL TIMESTAMP если он доступен.

На стороне SQLServerDatabase определите столбец как SMALLDATETIME и со стороны java

 Timestamp sqlDate = new Timestamp( System.currentTimeMillis() ); preparedStmt.setTimestamp( ++startIndex, sqlDate ); 

На стороне SQLServerDatabase не указывается тип столбца как Timestamp, иначе вы получите следующее исключение.

Невозможно вставить явное значение в столбец временной метки. Используйте INSERT со списком столбцов, чтобы исключить столбец timestamp или вставить DEFAULT в столбец временной метки

Interesting Posts

Вызывается: java.lang.UnsupportedOperationException: невозможно преобразовать в измерение: type = 0x1

Двойная точность – десятичные разряды

Время проводов кабельного модема увеличивается до тысячи миллисекунд после 10 минут использования

Что такое эквивалент cmd для Bash's & (амперсанд) для запуска команды, не дожидаясь ее завершения?

Преобразование ivy.xml в pom.xml

Обработка ошибок в ASP.NET MVC

Как округлить число до n десятичных знаков в Java

WMI для перезагрузки удаленной машины

Почему C требуется ключевое слово struct, а не C ++?

Как обращаться с Dynamic JSON в Модернизации?

Как сделать аргумент cd аргументом INsensitive?

Как декодировать HTML-объекты в swift?

Приемник широковещательной передачи не работает в ICS, если приложение не запускается по крайней мере один раз

«Получение фабрики COM-classа для компонента … ошибка: 80070005 Доступ запрещается». (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))

Печать с использованием команды lpr в 64-битной Windows

Давайте будем гением компьютера.