Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Гранить в TIMESTAMP год до нашей эры  [new]
RTYi
Member

Откуда:
Сообщений: 91
0001-10-02 00:00:00 B.C.
- имею такую дату до нашей эры (B.C. -before Christ), как ее можно сохранить в Оракловский TIMESTAMP(6)?
21 дек 10, 11:47    [9971873]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
RTYi
0001-10-02 00:00:00 B.C.
- имею такую дату до нашей эры (B.C. -before Christ), как ее можно сохранить в Оракловский TIMESTAMP(6)?


http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#sthref419

select to_timestamp('0001-10-02 00:00:00 B.C.', 'yyyy-mm-dd hh24:mi:ss B.C.') from DUAL;
21 дек 10, 11:54    [9971955]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
RTYi
Member

Откуда:
Сообщений: 91
А как эта дата должна выглядеть, что бы она загружалась лоадером?

Вот так: 02-OCT-02 00.00.00.000000000 ?
21 дек 10, 12:05    [9972074]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8134
RTYi,
Near topic:
Есть ли смысл в хранении времени с такой точностью для столь древних времён?
21 дек 10, 12:17    [9972218]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
RTYi
Member

Откуда:
Сообщений: 91
SQL*Plus,

Мне приходит дата 0001-10-02 00:00:00 B.C. мне нужно ее загрузить через лоадер в базу.
21 дек 10, 12:20    [9972257]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
RTYi
А как эта дата должна выглядеть, что бы она загружалась лоадером?

Вот так: 02-OCT-02 00.00.00.000000000 ?

С налету у меня получилось загрузить года до нашей эры в формате BC, вот так:

create table TEST (ts timestamp);
sqlldr.ini

load data
infile *
into table TEST truncate
fields terminated by ',' optionally enclosed by '"'
trailing nullcols (
ts "to_timestamp(:ts, 'YYYY-MM-DD-HH24.MI.SS BC')"

)

begindata
"0001-10-02 00:00:00 BC"
"0001-10-01 00:00:00 BC"

На формат "B.C.", т.е. с точками, пока ругается, интересно узнать почему.
21 дек 10, 12:35    [9972452]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8134
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production

SQL> select TO_CHAR(to_timestamp('0001-10-02 00:00:00 B.C.', 'yyyy-mm-dd hh24:mi:ss B.C.'), 'Sy

TO_CHAR(TO_TIMESTAMP('000
-------------------------
-0001-10-02 00:00:00 B.C.

SQL> CREATE TABLE killme_ts(ts timestamp);

-- LOAD DATA via SQL*Loader
...
 
SQL> SELECT TO_CHAR(ts, 'Syyyy-mm-dd hh24:mi:ss B.C.') from killme_ts;

TO_CHAR(TS,'SYYYY-MM-DDHH
-------------------------
-0001-10-02 00:00:00 B.C.

SQL*Loader Control File
LOAD DATA 
INFILE *
INTO TABLE killme_ts
TRAILING NULLCOLS
(
   ts DATE "yyyy-mm-dd hh24:mi:ss B.C."
)
BEGINDATA
0001-10-02 00:00:00 B.C.


И всё же!
Есть ли смысл в хранении времени с такой точностью для столь древних времён?
21 дек 10, 12:41    [9972514]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
RTYi
Member

Откуда:
Сообщений: 91
Denis Popov,

Да, с точками и у меня ругается. А как быть, если я получаю в данных, наряду с данными B.C. обычное время, тогда оно по вашему шаблону загрузится не верно?
21 дек 10, 12:43    [9972538]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
SQL*Plus
SQL*Loader Control File
LOAD DATA 
INFILE *
INTO TABLE killme_ts
TRAILING NULLCOLS
(
   ts DATE "yyyy-mm-dd hh24:mi:ss B.C."
)
BEGINDATA
0001-10-02 00:00:00 B.C.


И оно загрузилось? У меня все записи вылетают по "ORA-01856: BC/B.C. or AD/A.D. required"
21 дек 10, 12:45    [9972559]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
RTYi
Member

Откуда:
Сообщений: 91
SQL*Plus
Есть ли смысл в хранении времени с такой точностью для столь древних времён?


Возможно, есть смысл, если это используют в играх. Я точно не знаю в чем эти данные юзаются, но мне они приходят в таком виде :)
21 дек 10, 12:47    [9972582]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862

On 21.12.2010 12:43, RTYi wrote:

> Да, с точками и у меня ругается. А как быть, если я получаю в данных, наряду с данными B.C. обычное время, тогда оно по
> вашему шаблону загрузится не верно?

Т.е. для нашей эры ничего не указывается, или все-таки AD там есть?

Posted via ActualForum NNTP Server 1.4

21 дек 10, 12:50    [9972620]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
RTYi
Member

Откуда:
Сообщений: 91
Denis Popov,

AD нету.
21 дек 10, 12:52    [9972641]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8134
Denis Popov
И оно загрузилось? У меня все записи вылетают по "ORA-01856: BC/B.C. or AD/A.D. required"

SQL> SELECT TO_CHAR(ts, 'Syyyy-mm-dd hh24:mi:ss B.C.') from killme_ts;

TO_CHAR(TS,'SYYYY-MM-DDHH
-------------------------
-0001-10-02 00:00:00 B.C.
-0001-10-02 01:02:03 B.C.
 2010-12-21 01:02:03 A.D.

+ SQL*Loader Input & Output

LOAD DATA 
INFILE *
REPLACE
INTO TABLE killme_ts
TRAILING NULLCOLS
(
   ts DATE "yyyy-mm-dd hh24:mi:ss B.C."
)
BEGINDATA
0001-10-02 00:00:00 B.C.
0001-10-02 01:02:03 B.C.
2010-12-21 01:02:03 A.D.


SQL*Loader: Release 10.2.0.4.0 - Production on Tue Dec 21 12:49:48 2010

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Control File:   load_TS.ctl
Data File:      load_TS.ctl
  Bad File:     load_TS.bad
  Discard File:  none specified
 
 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:     64 rows, maximum of 256000 bytes
Continuation:    none specified
Path used:      Conventional

Table KILLME_TS, loaded from every logical record.
Insert option in effect for this table: REPLACE
TRAILING NULLCOLS option in effect

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
TS                                  FIRST    24           DATE yyyy-mm-dd hh24:mi:ss B.C.


Table KILLME_TS:
  3 Rows successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.


Space allocated for bind array:                   1664 bytes(64 rows)
Read   buffer bytes: 1048576

Total logical records skipped:          0
Total logical records read:             3
Total logical records rejected:         0
Total logical records discarded:        0

Run began on Tue Dec 21 12:49:48 2010
Run ended on Tue Dec 21 12:49:48 2010

Elapsed time was:     00:00:00.09
CPU time was:         00:00:00.06
21 дек 10, 12:52    [9972646]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
RTYi
AD нету.

Загрузи может быть как есть, строкой, во временную таблицу, а в базе уже будет намного проще приводить к требуемому формату.
21 дек 10, 13:05    [9972820]     Ответить | Цитировать Сообщить модератору
 Re: Гранить в TIMESTAMP год до нашей эры  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8134
RTYi
AD нету.

LOAD DATA 
INFILE *
REPLACE
INTO TABLE killme_ts
WHEN (21:24) = 'B.C.'
TRAILING NULLCOLS
(
   ts POSITION(1) DATE "yyyy-mm-dd hh24:mi:ss B.C."
)
INTO TABLE killme_ts
WHEN (21:24) <> 'B.C.'
TRAILING NULLCOLS
(
   ts POSITION(1) DATE "yyyy-mm-dd hh24:mi:ss"
)
BEGINDATA
3001-10-02 00:00:00 B.C.
0001-10-02 01:02:03 B.C.
2010-12-21 01:02:03
4521-12-02 04:05:06 B.C.

TO_CHAR(TS,'SYYYY-MM-DDHH
-------------------------
-3001-10-02 00:00:00 B.C.
-0001-10-02 01:02:03 B.C.
-4521-12-02 04:05:06 B.C.
 2010-12-21 01:02:03 A.D.
21 дек 10, 13:30    [9973135]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить