Подготовленное заявление 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 в столбец временной метки

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