Подготовленное заявление 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
- Закрытие соединений JDBC в пуле
- Доступ Java JDBC Access для пользователя
- Исключение ResultSet - до начала набора результатов
- ПодготовленоСодержание с Statement.RETURN_GENERATED_KEYS
- Ошибка: Столбец не существует
Что мне следует добавить в setDate()
чтобы получить время?
- Как получить счетчик строк, используя ResultSet в Java?
- ojdbc14.jar против ojdbc6.jar
- Соединение JDBC в Android
- java sql date time
- ResultSet.getString (1) throws java.sql.SQLException: Неверная операция в текущей позиции курсора
- Чтобы предотвратить утечку памяти, драйвер JDBC был принудительно незарегистрирован
- Почему я получаю java.lang.AbstractMethodError при попытке загрузить blob в db?
- JDBC возвращает исключение MySQLSyntaxError с правильным утверждением
Вместо 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 в столбец временной метки