Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Java |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Есть таблица с колонкой типа time (база: sybase asa) В приложении получаю данные из этой колонки всё норм, пока час не равно 00 То есть любое другое время отображается правильно,а вот например 00:29 отображается как 23:29, то есть на час меньше. Повторяю, во всех остальных случаях время отображается правильно. В java этот тип отображается на java.sql.time Возможно что-то с часовыми поясами, но почему глюк только при переходе через 00 часов? Вероятно здесь что-то очень простое, но не понимаю что. |
28 авг 19, 11:32 [21958908] Ответить | Цитировать Сообщить модератору |
вадя Member Откуда: Екатеринбург Сообщений: 18678 |
sergnn, преобразуй в запросе время в строку в нужном фомате |
28 авг 19, 12:09 [21958962] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
вадя, Мда? Я получаю данные через объект JPA? Там как поменять? |
28 авг 19, 12:13 [21958965] Ответить | Цитировать Сообщить модератору |
вадя Member Откуда: Екатеринбург Сообщений: 18678 |
ну дак будешь иметь дело с уже готовой строкой и просто отправишь её юзеру |
||||
28 авг 19, 14:05 [21959079] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
вадя, А от юзера данные тоже перелопачивать в этот кривой формат? Криво всё это... |
28 авг 19, 14:10 [21959085] Ответить | Цитировать Сообщить модератору |
Kachalov Member Откуда: Москва Сообщений: 5807 |
- в чем суть проблемы не ясно (возможно настройки БД, проблемный JDBC-драйвер, настройки локализации и т п), но если надо через JPA "руками" данные конвертнуть, то @Convert |
||
28 авг 19, 14:15 [21959094] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Kachalov, JPA ту видимо не при делах. Если просто делаю: Statement st = connection.createStatement(); ResultSet rs = st.executeQuery("select '00:29:00' "); ResultSet rs = st.executeQuery("select '23:29:00' "); if (rs.next()) Time result = rs.getTime(1); result в обоих случаях 23:29:00 разве что на самом деле JDBC драйвер дурит... |
28 авг 19, 14:53 [21959133] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Kachalov, Если делать эти запросы в самой базе, то результаты правильные. Но там соединение идёт по ODBC |
28 авг 19, 14:55 [21959137] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Kachalov, Извиняюсь, с последними двумя постами ошибся. |
28 авг 19, 15:08 [21959150] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Kachalov, мда. Как раз с предыдущем примером все норм. А вот если так: Statement st = connection.createStatement(); ResultSet rs = st.executeQuery("select cast('00:29:00' as time) "); ResultSet rs = st.executeQuery("select cast('23:29:00' as time) "); if (rs.next()) Time result = rs.getTime(1); Вот тут и получаем в обоих случаях 23:29 |
28 авг 19, 15:20 [21959163] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9316 |
Одному мне кажется, что проблемы с преобразованием форматов на стороне сервера к Java вообще никого отношения не имеют? Читать доку по SQL серверу, как правильно преобразоывать строки в тип времени |
28 авг 19, 15:25 [21959170] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9316 |
Сильно напоминает "You might receive unexpected results in JDBC and SQLJ applications if you use date, time, and timestamp values that do not correspond to real dates and times." ( C ) какая-то документация поскольку нифига не понятно, что же именно сохранено в базе (да и какая собственно база и дравера), думаю, что-то большее угадать по хрустальному шару крайне тяжело |
28 авг 19, 15:48 [21959192] Ответить | Цитировать Сообщить модератору |
вадя Member Откуда: Екатеринбург Сообщений: 18678 |
sergnn, а так Statement st = connection.createStatement(); ResultSet rs = st.executeQuery("select cast('00:29:00' as time) "); if (rs.next()) Time result = rs.getTime(1); |
28 авг 19, 16:03 [21959211] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9316 |
если драйвер jConnect, то пальцем в небо можно попытаться "Set the connection option RETURN_DATE_TIME_AS_STRING to ON in order to get SQL Anywhere to always return DATE/TIME/TIMESTAMP values as strings. " по крайне мере, проще будет тестить, что же именно приходит от сервера и что же именно хранится в базе IMHO |
28 авг 19, 16:03 [21959212] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Leonid Kudryavtsev, В общем прояснилось: почему то 00:29 из базы воспринимается как 23:29 31 декабря 1969 года а вот Time.valueOf("00:29:00") воспринимается как 00:29 1 января 1970 года. Сия тайна велика есть... |
28 авг 19, 16:16 [21959229] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9316 |
Выличить удалось? Если да, то как?
|
||||
28 авг 19, 16:32 [21959250] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9316 |
А если: SELECT CONVERT( time, '00:29:00', 14 ) ? Вообще, все больше кажется. что проблема с тайм-зоной (зимнее/летнее время). Но тогда "падеж падежей" у Вас должен быть на всех константах, не только на 0:29.
|
||
28 авг 19, 16:59 [21959276] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Leonid Kudryavtsev, Лечить, честно говоря, лениво. Да и всё равно получится криво. Видимо придётся в базе храните в стрингах. И преобразовывать в Time уже в приложении. Конечно тоже криво, но значительно быстрее. |
28 авг 19, 17:09 [21959285] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Насколько помню, команды Convert нет в стандарте SQL. Там есть Cast. |
||
28 авг 19, 17:11 [21959287] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9316 |
CAST это кастование из одного типа в другой. Кастовать строчки, без явного указания формата.... "гарантию может дать только страховой полис". Т.к., вообще то, используемый формат может зависит от настроект базы/клиента/соединения/страны (часового пояса)
мне года 4-и назад, ровно так и пришлось поступить https://www.sql.ru/forum/1187891/jdbc-postgres-java-time-zoneddatetime?hl=timezone postgresql обычно со строками только одна проблема - сортировка в базе, но для чисто времени: что time, что varchar - будет сортировать (и даже сравнивать) правильно. Т.ч., в общем-то и пофиг. А с учетом, как через ж.... в Java сделаны типы с датой, возможно хранить в varchar это и хорошо (надежнее). |
||||
28 авг 19, 17:39 [21959313] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4381 |
Завтра вы столкнетесь с новыми "чудесами" и снова сделаете костыль? Во что превратится ваше ПО через год? |
||
29 авг 19, 13:16 [21959793] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4381 |
Насколько помню, команды Convert нет в стандарте SQL. Там есть Cast.[/quote] Есть такая команда. |
||||
29 авг 19, 13:17 [21959794] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4381 |
Есть такая команда.[/quote] Сорри - база: sybase asa - про неё не скажу. Имел в виду MS SQL |
||||
29 авг 19, 13:19 [21959796] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Сорри - база: sybase asa - про неё не скажу. Имел в виду MS SQL[/quot] В sybase asa как раз Convert есть. И в MS SQL есть , поскольку он наследник sybase'а. А вот в стандарте SQL увы и ах. Поскольку в плане у нас переход в Postgre SQL, то стараемся не умножать сущности сверх необходимого. |
||||
29 авг 19, 15:15 [21959923] Ответить | Цитировать Сообщить модератору |
sergnn Member Откуда: Нижний Новгород Сообщений: 374 |
Предложите решение проблемы. Вы предлагаете на каждом этапе анализировать час и если 00 то отнимать один час? Но это ещё больший костыль. Или хранить время как дату с произвольной собственно датой? Тоже костыль ещё тот. |
||||
29 авг 19, 15:17 [21959925] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Java | ![]() |