Подготовленный оператор с использованием Timestamp требует больше наносекунд

Я использую следующую инструкцию для получения метки времени из моей базы данных SQL:

stmt.setTimestamp(i++, new java.sql.Timestamp(example.getExampleDate().getTime()))

Который отлично работает и возвращает:

2013-02-22 12:27:34.0 

Теперь бывает, что мне нужно поточнее, вот так:

2013-02-22 12:27:34.000

Итак, я нашел в документах следующий метод, который, по-видимому, именно то, что я хочу:

setNanos (целое число)

Устанавливает поле nanos этого объекта Timestamp в заданное значение.

Но мне нужно выяснить, как включить это в мое подготовленное заявление?

я пробовал например

stmt.setTimestamp(i++, new java.sql.Timestamp(example.getExampleDate().getTime()).setNanos(3));

но чем это возвращает следующую ошибку:

The method setTimestamp(int, Timestamp) in the type PreparedStatement is not applicable for the arguments (int, void)

Большое спасибо за твою помощь!


person bngschmnd    schedule 11.11.2016    source источник
comment
Ну, вы устанавливаете nanos во временной метке, а затем передаете эту временную метку в качестве параметра подготовленного оператора. В чем конкретный вопрос?   -  person JB Nizet    schedule 11.11.2016
comment
Как это сделать?   -  person bngschmnd    schedule 11.11.2016
comment
34.000 не является более точным, чем 34.0, .0 - это просто то, что используется, когда доля миллисекунды равна 0. Также имейте в виду, что getTime имеет точность только в миллисекундах. Часть nanos является отдельной. Пожалуйста, опишите более конкретный вариант использования. Кстати: действительно ли SQL Server может хранить временные метки с точностью до наносекунды?   -  person Mark Rotteveel    schedule 11.11.2016
comment
Да, в моей базе данных есть записи в формате, указанном выше, с точностью до 3 миллисекунд.   -  person bngschmnd    schedule 11.11.2016
comment
Спасибо, JB, ваш комментарий предоставил мне необходимую информацию. К сожалению, когда я использую «setNanos (000)», он снова сокращается до 34,0.   -  person bngschmnd    schedule 11.11.2016
comment
Это элементарная арифметика. Число 0 и число 0 - это число 0. 000 по-прежнему 0. Точно так же, как 0,5, 0,50 и 0,500 - это одно и то же число. То, что вы хотите, это не изменять значение метки времени. Что вы хотите, так это отформатировать его как строку по-другому, со значением 0, отформатированным как 000. setNanos() не поможет. Присоедините 00 к строке, которую вы получите при форматировании.   -  person JB Nizet    schedule 11.11.2016


Ответы (1)


setNanos() возвращает пустоту. Таким образом, выражение new java.sql.Timestamp(example.getExampleDate().getTime()).setNanos(3) имеет тип void. Вы не можете передать пустоту методу setTimestamp(). Вы должны передать метку времени.

Итак, используйте переменную:

Timestamp timestamp = new Timestamp(example.getExampleDate().getTime());
timestamp.setNanos(3);
stmt.setTimestamp(i++, timestamp);
person JB Nizet    schedule 11.11.2016
comment
Важное предостережение из javadoc: Примечание. Этот тип является составным элементом java.util.Date и отдельным значением в наносекундах. В компоненте java.util.Date хранятся только целые секунды. Дробные секунды — нано — разделены. Таким образом, вызов setNanos перезапишет любое значение доли секунды, полученное из значения getTime! - person Mark Rotteveel; 11.11.2016
comment
Ваш код возвращает 2011-10-21 11:38:40.000000003 для метки времени. Если я использую timestamp.setNanos(234), он возвращает 2011-10-21 11:38:40.0000000234. - person bngschmnd; 11.11.2016
comment
Это означает, что он работает нормально: у вас есть правильное значение nanos. В чем проблема. Что еще вы ожидали? - person JB Nizet; 11.11.2016
comment
Мне нужно, чтобы значение nano было объявлено тремя цифрами, даже если они нули. не 22.02.2013 12:27:34.0, а 22.02.2013 12:27:34.000 - person bngschmnd; 11.11.2016
comment
Затем напишите метод, форматирующий метку времени так, как вы хотите. Настройки nanos для метки времени этого не сделают. Вам не нужны наносекунды в вашей метке времени. Вы хотите, чтобы значение 0 отображалось как 000. - person JB Nizet; 11.11.2016
comment
Любые предложения по подходу к решению этой проблемы? Потому что я думаю, что возиться с методами toString() здесь не очень хорошая идея. - person bngschmnd; 11.11.2016