Подготовленное JDBC заявление. setDate (....) не экономит время, только дату. Как я могу также сэкономить время? - PullRequest
21 голосов
/ 29 июля 2011

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

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(), чтобы получить время также?

Ответы [ 3 ]

37 голосов
/ 29 июля 2011

Вместо Дата следует использовать Метка времени и метод 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());
6 голосов
/ 29 июля 2011

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

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

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

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

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

0 голосов
/ 24 июня 2015

На стороне SQLServerDatabase определите столбец как SMALLDATETIME, а на стороне java используйте

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

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

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

...