powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование date в строку: нулевая дата
25 сообщений из 26, страница 1 из 2
Преобразование date в строку: нулевая дата
    #39892415
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, столкнулся с непоняткой
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

descr INDIVIDUAL
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(38)
 LAST_NAME                                 NOT NULL VARCHAR2(255)
 FIRST_NAME                                NOT NULL VARCHAR2(255)
 MIDDLE_NAME                                        VARCHAR2(255)
 BIRTH_DATE                                         DATE


SQL> SELECT T.birth_date, TO_CHAR(birth_date , 'dd.mm.yyyy'), TO_CHAR(CAST(birth_date AS TIMESTAMP), 'dd.mm.yyyy')
  2     , SUBSTR(DUMP(T.birth_date),1,30)  
  3   FROM INDIVIDUAL T
  4  WHERE T.ID =328417;                 

BIRTH_DAT TO_CHAR(BI TO_CHAR(CA SUBSTR(DUMP(T.BIRTH_DATE),1,30
--------- ---------- ---------- ------------------------------
01-АПР-83 00.00.0000 01.04.1983 Typ=12 Len=7: 119,183,4,1,0,1,



В чём может быть дело? Почему TO_CHAR(birth_date , 'dd.mm.yyyy') преобразуется в 00.00.0000 ?
Причем не во всех записях, а только в некоторых.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892423
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah,

Часы разбились.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892434
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah,

кстати, а зачем вы перед to_char предварительно DATE в TIMESTAMP конвертируете?
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892437
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah,

11.2.0.3.0

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
insert into INDIVIDUAL values(328417,date '1983-04-01');


SQL> ed
Wrote file afiedt.buf

  1  SELECT T.birth_date, TO_CHAR(birth_date , 'dd.mm.yyyy'), TO_CHAR(CAST(birth_date AS TIMESTAMP), 'dd.mm.yyyy')
  2       , SUBSTR(DUMP(T.birth_date),1,40)
  3     FROM INDIVIDUAL T
  4*   WHERE T.ID =328417
SQL> /

BIRTH_DA TO_CHAR(BI TO_CHAR(CA SUBSTR(DUMP(T.BIRTH_DATE),1,40)
-------- ---------- ---------- ----------------------------------------
01.04.83 01.04.1983 01.04.1983 Typ=12 Len=7: 119,183,4,1,1,1,1



.....
stax
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892439
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select d, to_chaR(d, 'yyyymmdd') cd, dump(d) dd from (
  2              select dbms_stats.convert_raw_to_date('77B70401010101') d from dual
  3    union all select dbms_stats.convert_raw_to_date('77B70401000101') d from dual);

D                   CD       DD
------------------- -------- ----------------------------------------
1983-04-01 00:00:00 19830401 Typ=12 Len=7: 119,183,4,1,1,1,1
1983-04-01 01:00:00 00000000 Typ=12 Len=7: 119,183,4,1,0,1,1
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892443
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
Sah,

кстати, а зачем вы перед to_char предварительно DATE в TIMESTAMP конвертируете?


Тогда конвертация работает правильно.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892454
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah

Тогда конвертация работает правильно.


Возможно у Вас какие-то битые данные

странно что не слетает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  9* from (select '77b70401 010001' p_str from dual)
SQL> /
                                                                        *
ERROR at line 7:
ORA-01851: minutes must be between 0 and 59

  9* from (select '77b70401 010101' p_str from dual)
SQL> /

D
---------------------------------------------------------------------------
01.04.1983 00:00:00,000000000



....
stax
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892456
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah
Тогда конвертация работает правильно.
Удача. Если в дате лежит недата, то надеяться на успех крайне неосмотрительно.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892457
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Возможно … битые данные
Ты сомневаешься?
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892459
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select d, to_chaR(d, 'yyyymmdd') cd, dump(d) dd from (
  2              select dbms_stats.convert_raw_to_date('77B70401010101') d from dual
  3    union all select dbms_stats.convert_raw_to_date('77B70401000101') d from dual);

D                   CD       DD
------------------- -------- ----------------------------------------
1983-04-01 00:00:00 19830401 Typ=12 Len=7: 119,183,4,1,1,1,1
1983-04-01 01:00:00 00000000 Typ=12 Len=7: 119,183,4,1,0,1,1



Это что, у меня при записи в поле date данные побились?
А почему тогда TO_CHAR(CAST(birth_date AS TIMESTAMP), 'dd.mm.yyyy') срабатывает правильно?

А, и кстати,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT 
      TO_CHAR(CAST(birth_date AS TIMESTAMP), 'dd.mm.yyyy hh24:mi:ss') AS birth_date_TS
 FROM INDIVIDUAL T
WHERE T.ID =328417
              *
Error at line 2
ORA-01877: строка слишком длинна для внутреннего буфера



Как будто Оракл подглядывает на формат маски, и если hh24:mi:ss не указано, то конвертирует в строку только первые 4 байта, а если указать, тогда падает.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892465
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Stax
Возможно … битые данные
Ты сомневаешься?


А как это могло произойти?
У меня в эту таблицу только хранимки на этом же сервере пишут.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892466
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Stax
Возможно … битые данные
Ты сомневаешься?

да

не работал с 12-й

.....
stax
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892467
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah
Это что, у меня при записи в поле date данные побились?
to_char(date'???','DD/MM/YYYY HH24:MI:SS') = '00/00/0000 00:00:00'

date > 24.00.00

хитрое значение в поле типа date
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892468
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
не работал с 12-й
По-твоему, внутренний формат от этого изменился?
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892472
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Stax
не работал с 12-й
По-твоему, внутренний формат от этого изменился?

надеюсь что нет, но кто-то ж один бит запортил (не руками ж поменяли)

мож 12-ка не так понимает древний клиент, мож жучок, мож ..., не наю

к тому-же CAST(birth_date AS TIMESTAMP ) не слетает, хотя должен был "отреагировать"

идей у меня много, жаль куры издохли

....
stax
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892476
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, нашёл источник проблемы:
---------------------------
Kettle - Spoon Stable Release - 4.3.0
(c) {0} Pentaho Corporation
www.pentaho.com
Build version : 4.3.0-stable
Build date : 2012-04-24 14.11.32
------------------------

Это я из Access в Oracle данные перегонял. Видимо, тут они и побились.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892481
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вряд ли кто-по прямо в файлы Oracle пишет.

Т.ч. явно баг Oracle клиента (+backend), что он недо-проверяет переданные ему данные.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892483
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перегнал дату в текстовом формате

Код: plsql
1.
Thu Mar 31 23:00:00 MSK 1983



Старая непропатченная Java?
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892487
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah,

арифметика с етой строкой работает? напр +/- сек ...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  1  with t as (
  2  select birth_date d1,birth_date+sign(to_char(birth_date,'dd'))/24/60/60-(INTERVAL '1' SECOND)  d2
  3  FROM INDIVIDUAL T WHERE T.ID =328417)
  4  select
  5   to_char(d1,'dd.mm.yyyy hh24:mi:ss') d1
  6  ,to_char(d2,'dd.mm.yyyy hh24:mi:ss') d2
  7* ,dump(d1) dd1,dump(d2) dd2 from t
SQL> /

D1                  D2                  DD1                                      DD2
------------------- ------------------- ---------------------------------------- ----------------------------------
01.04.1983 00:00:00 01.04.1983 00:00:00 Typ=12 Len=7: 119,183,4,1,1,1,1          Typ=13 Len=8: 191,7,4,1,0,0,0,0




.....
stax
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892493
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Sah,

арифметика с етой строкой работает? напр +/- сек ...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  1  with t as (
  2  select birth_date d1,birth_date+sign(to_char(birth_date,'dd'))/24/60/60-(INTERVAL '1' SECOND)  d2
  3  FROM INDIVIDUAL T WHERE T.ID =328417)
  4  select
  5   to_char(d1,'dd.mm.yyyy hh24:mi:ss') d1
  6  ,to_char(d2,'dd.mm.yyyy hh24:mi:ss') d2
  7* ,dump(d1) dd1,dump(d2) dd2 from t
SQL> /

D1                  D2                  DD1                                      DD2
------------------- ------------------- ---------------------------------------- ----------------------------------
01.04.1983 00:00:00 01.04.1983 00:00:00 Typ=12 Len=7: 119,183,4,1,1,1,1          Typ=13 Len=8: 191,7,4,1,0,0,0,0




.....
stax


Работает, только результат совсем другой:
Код: plsql
1.
2.
3.
D1                          D2                         DD1                                    DD2
-------------------     -------------------     ------------------------------- ----------------------------------
00.00.0000 00:00:00	 11.04.1983 14:59:59	Typ=12 Len=7: 119,183,4,1,0,1,1	Typ=13 Len=8: 191,7,4,11,14,59,59,0
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892497
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah

Работает, только результат совсем другой:

імхо
Луче что б слетало

.....
stax
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892499
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во блин, подставил другую JAVA
Код: plsql
1.
java version "1.8.0_191"



Теперь после заливки получаю
Код: plsql
1.
2.
3.
BIRTH_DAT BIRTH_DATE_CH       BIRTH_DATE BIRTH_DATE_DMP
--------- ------------------- ---------- --------------------------------------------------
31-АПР-83 31.03.1983 23:00:00 31.03.1983 Typ=12 Len=7: 119,183,3,31,24,1,1
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892506
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sah
Во блин, подставил другую JAVA

Главное найден шкодник

Как-то поборете

.....
stax
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892724
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я всё-равно не врубился, если поле в Oracle уже типа DATE (как описано в первом посте топика)
Код: plsql
1.
BIRTH_DATE     DATE


..., то как там может быть "мусор"? Oracle же просто не даст записать в таблицу, выкинув ошибку несоответствия значения типу.
...
Рейтинг: 0 / 0
Преобразование date в строку: нулевая дата
    #39892729
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
Oracle же просто не даст записать в таблицу, выкинув ошибку
Наивный. Почитай мои ссылки. Дата во внутреннем формате не проверяется.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование date в строку: нулевая дата
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]