Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
Есть таблица с колонкой типа time (база: sybase asa)
В приложении получаю данные из этой колонки
всё норм, пока час не равно 00
То есть любое другое время отображается правильно,а вот например 00:29 отображается как 23:29,
то есть на час меньше.
Повторяю, во всех остальных случаях время отображается правильно.

В java этот тип отображается на java.sql.time

Возможно что-то с часовыми поясами, но почему глюк только при переходе через 00 часов?
Вероятно здесь что-то очень простое, но не понимаю что.
28 авг 19, 11:32    [21958908]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16787
sergnn,
преобразуй в запросе время в строку в нужном фомате
28 авг 19, 12:09    [21958962]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
вадя,
Мда? Я получаю данные через объект JPA? Там как поменять?
28 авг 19, 12:13    [21958965]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16787
sergnn
Мда? Я получаю данные через объект JPA? Там как поменять?

sergnn
В java этот тип отображается на java.sql.time

ну дак будешь иметь дело с уже готовой строкой и просто отправишь её юзеру
28 авг 19, 14:05    [21959079]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
вадя,
А от юзера данные тоже перелопачивать в этот кривой формат?
Криво всё это...
28 авг 19, 14:10    [21959085]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5677
sergnn
Я получаю данные через объект JPA? Там как поменять?

- в чем суть проблемы не ясно (возможно настройки БД, проблемный JDBC-драйвер, настройки локализации и т п), но если надо через JPA "руками" данные конвертнуть, то @Convert
28 авг 19, 14:15    [21959094]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
Kachalov,
Если делать эти запросы в самой базе, то результаты правильные.
Но там соединение идёт по ODBC
28 авг 19, 14:55    [21959137]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
Kachalov,

Извиняюсь, с последними двумя постами ошибся.
28 авг 19, 15:08    [21959150]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7994
Одному мне кажется, что проблемы с преобразованием форматов на стороне сервера к Java вообще никого отношения не имеют?

Читать доку по SQL серверу, как правильно преобразоывать строки в тип времени
28 авг 19, 15:25    [21959170]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7994
Сильно напоминает "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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16787
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7994
если драйвер 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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7994
Выличить удалось? Если да, то как?

sergnn
...воспринимается как 23:29 31 декабря 1969 года...


JavaDoc
public class Time
extends Date

A thin wrapper around the java.util.Date class that allows the JDBC API to identify this as an SQL TIME value. The Time class adds formatting and parsing operations to support the JDBC escape syntax for time values.

The date components should be set to the "zero epoch" value of January 1, 1970 and should not be accessed.
28 авг 19, 16:32    [21959250]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7994
А если:
SELECT CONVERT( time, '00:29:00', 14 )
?

Вообще, все больше кажется. что проблема с тайм-зоной (зимнее/летнее время). Но тогда "падеж падежей" у Вас должен быть на всех константах, не только на 0:29.

To define a time you need the time and the time zone. A time stamp is the time which passed since
January 1, 1970, 00:00:00 GMT. So a time stamp is well defined and should not be changed in anyway when its written to the database.
Otherwise you end up with that strange situation that time stamp 0 is not January 1, 1970, 00:00:00 GMT.
28 авг 19, 16:59    [21959276]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
Leonid Kudryavtsev,
Лечить, честно говоря, лениво. Да и всё равно получится криво.
Видимо придётся в базе храните в стрингах.
И преобразовывать в Time уже в приложении.
Конечно тоже криво, но значительно быстрее.
28 авг 19, 17:09    [21959285]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
Leonid Kudryavtsev
А если:
SELECT CONVERT( time, '00:29:00', 14 )
[/quot]

Насколько помню, команды Convert нет в стандарте SQL.
Там есть Cast.
28 авг 19, 17:11    [21959287]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7994
sergnn
Там есть Cast.

CAST это кастование из одного типа в другой.

Кастовать строчки, без явного указания формата.... "гарантию может дать только страховой полис". Т.к., вообще то, используемый формат может зависит от настроект базы/клиента/соединения/страны (часового пояса)

sergnn
Видимо придётся в базе храните в стрингах.
И преобразовывать в Time уже в приложении

мне года 4-и назад, ровно так и пришлось поступить
https://www.sql.ru/forum/1187891/jdbc-postgres-java-time-zoneddatetime?hl=timezone postgresql

обычно со строками только одна проблема - сортировка в базе, но для чисто времени: что time, что varchar - будет сортировать (и даже сравнивать) правильно. Т.ч., в общем-то и пофиг.

А с учетом, как через ж.... в Java сделаны типы с датой, возможно хранить в varchar это и хорошо (надежнее).
28 авг 19, 17:39    [21959313]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4006
sergnn
Leonid Kudryavtsev,
Лечить, честно говоря, лениво. Да и всё равно получится криво.
Видимо придётся в базе храните в стрингах.
И преобразовывать в Time уже в приложении.
Конечно тоже криво, но значительно быстрее.

Завтра вы столкнетесь с новыми "чудесами" и снова сделаете костыль?
Во что превратится ваше ПО через год?
29 авг 19, 13:16    [21959793]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4006
sergnn
Leonid Kudryavtsev
А если:
SELECT CONVERT( time, '00:29:00', 14 )


Насколько помню, команды Convert нет в стандарте SQL.
Там есть Cast.[/quote]
Есть такая команда.
29 авг 19, 13:17    [21959794]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4006
SQL2008
sergnn
пропущено...


Насколько помню, команды Convert нет в стандарте SQL.
Там есть Cast.

Есть такая команда.[/quote]
Сорри - база: sybase asa - про неё не скажу. Имел в виду MS SQL
29 авг 19, 13:19    [21959796]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
SQL2008
SQL2008
пропущено...


Насколько помню, команды Convert нет в стандарте SQL.
Там есть Cast.

Есть такая команда.

Сорри - база: sybase asa - про неё не скажу. Имел в виду MS SQL[/quot]

В sybase asa как раз Convert есть. И в MS SQL есть , поскольку он наследник sybase'а.
А вот в стандарте SQL увы и ах.
Поскольку в плане у нас переход в Postgre SQL, то стараемся не умножать сущности сверх необходимого.
29 авг 19, 15:15    [21959923]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с типом Time  [new]
sergnn
Member

Откуда: Нижний Новгород
Сообщений: 374
SQL2008
sergnn
Leonid Kudryavtsev,
Лечить, честно говоря, лениво. Да и всё равно получится криво.
Видимо придётся в базе храните в стрингах.
И преобразовывать в Time уже в приложении.
Конечно тоже криво, но значительно быстрее.

Завтра вы столкнетесь с новыми "чудесами" и снова сделаете костыль?
Во что превратится ваше ПО через год?

Предложите решение проблемы.
Вы предлагаете на каждом этапе анализировать час и если 00 то отнимать один час?
Но это ещё больший костыль.
Или хранить время как дату с произвольной собственно датой?
Тоже костыль ещё тот.
29 авг 19, 15:17    [21959925]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить