Написание java.sql.Timestamp близкого к стандартному времени в Oracle ⇐ JAVA
Написание java.sql.Timestamp близкого к стандартному времени в Oracle
Несколько дней назад со мной произошла странная вещь, которую, к счастью, я смог довольно легко воспроизвести. Первоначально вместо двух временных меток была SYSTIMESTAMP, но поведение такое же. Первый ZonedDateTime, a, создан так, чтобы указывать момент непосредственно перед возвращением к стандартному времени в Центральной Европе.
пакет ermanno.date.oracle; импортировать java.sql.Connection; импортировать java.sql.DriverManager; импортировать java.sql.PreparedStatement; импортировать java.sql.ResultSet; импортировать java.sql.Timestamp; импортировать java.time.ZoneId; импортировать java.time.ZonedDateTime; публичный класс TimestampStackOverflow { public static void main(String[] args) { пытаться { DriverManager.registerDriver(новый oracle.jdbc.OracleDriver()); Подключение подключения = DriverManager.getConnection( "jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(LOAD_BALANCE=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xxx))) ", «ххх», «ххх»); String sql1 = "удалить из iannacci.ts3"; String sql2 = "вставить в значения iannacci.ts3 (?)"; String sql3 = "выберите * из iannacci.ts3 ORDER BY tt"; ReadedStatement stmt1 = conn.prepareStatement(sql1); ReadedStatement stmt2 = conn.prepareStatement(sql2); ReadedStatement stmt3 = conn.prepareStatement(sql3); ZonedDateTime a = ZonedDateTime.of(2023, 10, 29, 0, 59, 59, 0, ZoneId.of("UTC")); ZonedDateTime b = a.plusSeconds(2); stmt1.execute(); System.out.println(a + " " + a.toInstant().toEpochMilli()); System.out.println(b + " " + b.toInstant().toEpochMilli()); stmt2.setObject(1, новая отметка времени(a.toInstant().toEpochMilli())); stmt2.execute(); stmt2.setObject(1, новая отметка времени(b.toInstant().toEpochMilli())); stmt2.execute(); ResultSet r = stmt3.executeQuery(); пока (r.next()) { System.out.println(r.getTimestamp(1) + " " + r.getTimestamp(1).getTime()); } stmt3.закрыть(); stmt2.закрыть(); конн.закрыть(); } поймать (Исключение e) { е.printStackTrace(); } } } Таблица Oracle.
СОЗДАТЬ ТАБЛИЦУ IANNACCI.TS3 ( ТТ-МЕТКА ВРЕМЕНИ ); Результаты
2023-10-29T00:59:59Z[UTC] 1698541199000
2023-10-29T01:00:01Z[UTC] 1698541201000
2023-10-29 02:00:01.0 1698541201000
2023-10-29 02:59:59.0 1698544799000
Я ожидаю увидеть, что две временные метки, выделенные курсивом, будут такими же, как я вставил.
Я всегда рассчитывал, что Timestamp запишет «чистый» момент. Возврат к стандартному времени каким-то образом задействован, но я до сих пор не могу понять, чем Oracle возвращает данные, отличающиеся от того, что я пишу. SESSIONTIMEZONE — Европа/Рим.
Спасибо.
Несколько дней назад со мной произошла странная вещь, которую, к счастью, я смог довольно легко воспроизвести. Первоначально вместо двух временных меток была SYSTIMESTAMP, но поведение такое же. Первый ZonedDateTime, a, создан так, чтобы указывать момент непосредственно перед возвращением к стандартному времени в Центральной Европе.
пакет ermanno.date.oracle; импортировать java.sql.Connection; импортировать java.sql.DriverManager; импортировать java.sql.PreparedStatement; импортировать java.sql.ResultSet; импортировать java.sql.Timestamp; импортировать java.time.ZoneId; импортировать java.time.ZonedDateTime; публичный класс TimestampStackOverflow { public static void main(String[] args) { пытаться { DriverManager.registerDriver(новый oracle.jdbc.OracleDriver()); Подключение подключения = DriverManager.getConnection( "jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(LOAD_BALANCE=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xxx))) ", «ххх», «ххх»); String sql1 = "удалить из iannacci.ts3"; String sql2 = "вставить в значения iannacci.ts3 (?)"; String sql3 = "выберите * из iannacci.ts3 ORDER BY tt"; ReadedStatement stmt1 = conn.prepareStatement(sql1); ReadedStatement stmt2 = conn.prepareStatement(sql2); ReadedStatement stmt3 = conn.prepareStatement(sql3); ZonedDateTime a = ZonedDateTime.of(2023, 10, 29, 0, 59, 59, 0, ZoneId.of("UTC")); ZonedDateTime b = a.plusSeconds(2); stmt1.execute(); System.out.println(a + " " + a.toInstant().toEpochMilli()); System.out.println(b + " " + b.toInstant().toEpochMilli()); stmt2.setObject(1, новая отметка времени(a.toInstant().toEpochMilli())); stmt2.execute(); stmt2.setObject(1, новая отметка времени(b.toInstant().toEpochMilli())); stmt2.execute(); ResultSet r = stmt3.executeQuery(); пока (r.next()) { System.out.println(r.getTimestamp(1) + " " + r.getTimestamp(1).getTime()); } stmt3.закрыть(); stmt2.закрыть(); конн.закрыть(); } поймать (Исключение e) { е.printStackTrace(); } } } Таблица Oracle.
СОЗДАТЬ ТАБЛИЦУ IANNACCI.TS3 ( ТТ-МЕТКА ВРЕМЕНИ ); Результаты
2023-10-29T00:59:59Z[UTC] 1698541199000
2023-10-29T01:00:01Z[UTC] 1698541201000
2023-10-29 02:00:01.0 1698541201000
2023-10-29 02:59:59.0 1698544799000
Я ожидаю увидеть, что две временные метки, выделенные курсивом, будут такими же, как я вставил.
Я всегда рассчитывал, что Timestamp запишет «чистый» момент. Возврат к стандартному времени каким-то образом задействован, но я до сих пор не могу понять, чем Oracle возвращает данные, отличающиеся от того, что я пишу. SESSIONTIMEZONE — Европа/Рим.
Спасибо.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Непредвиденное исключение форматирования. Возврат к стандартному исключению в Python
Anonymous » » в форуме Python - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-