Подготовленное заявление 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

Как добавить точку останова в objc_exception_throw?

Извлечение пар слов с помощью String.split ()

Force InnoDB перепроверять foreign keys на столе / таблицах?

Доступ к инъецируемой зависимости в конструкторе управляемого компонента вызывает NullPointerException

Шаблон Singleton

открыть ресурс с относительным путем в java

Как передать смарт-экран на Win8 при установке подписанного приложения?

Попытка понять немедленное = «истинное» пропускание входов, если оно не должно

Модули Maven + Создание единого конкретного модуля

Настройка hibernate для подключения к базе данных через JNDI Datasource

Почему более новые поколения процессоров работают быстрее с одинаковой тактовой частотой?

Статические переменные в базовом classе, разделяемые всеми производными classами?

Добавление большего количества ОЗУ на разных скоростях? Будет ли это влиять на производительность настолько, чтобы сделать ее хуже, чем без ее добавления?

Эффективная реализация неизменяемого (двойного) LinkedList

Передача идентификатора пользователя в триггеры PostgreSQL

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