Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Вместо Дата вы должны использовать временную метку и метод 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());

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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