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

Откуда: Ульяновск/Москва
Сообщений: 43
Привет всем.
Столкнулся с такой проблемой - есть табличка, одно из полей которой - DATETIME (YEAR TO SECOND). Нужно сделать туды insert. Есть стока даты в немецком формате dd.mm.yyyy. Вопрос - как это сделать? insert не под каким соусом не хочет фидеть среди значений конструкцию вида TO_DATE('26.12.2003','%d.%m.%Y'). Упорно кричит, что синтакс еррор. Хотя если эту конструкцию загнать в селект, то она замечательно переваривается. Как решить эти грабли? Моё решение уж очень корявое. Делаю темповую таблицу, где вместо поля с датой - строка, затем инсертю туда нужные данные, а затем делаю INSERT INTO XXX SELECT. И уже внутри селекта делаю приобразование. Но это де криво. Что это за инсерт такой получается?
Ах, да, сервак - Informix 7.31
29 окт 04, 17:30    [1072176]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Dedushka Mazai
Member

Откуда:
Сообщений: 959
кажися ему надо передавать датавремя в виде '00:00:00 26.12.2003'
29 окт 04, 17:43    [1072223]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
DNSokol
Member

Откуда: Ульяновск/Москва
Сообщений: 43
стрянно. Ведь функция TO_DATE превращает строковое значение во внутренний формат даты информикса (т.е. в кол-во секунд, начиная с даты XXXX). Тама 2 параметра - собственно строка и её формат. Только вот он эта глупая железяка не хочет видеть внутри INSERT эту самую присловутую TO_DATE
29 окт 04, 19:14    [1072440]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Enlighten me
Member

Откуда:
Сообщений: 172
create temp table dtest
(
 dt DATETIME YEAR TO SECOND 
) ;

insert into dtest values ('2004-10-29 00:00:00') ;

Придется сделать преобразование данных в вышеприведенный вид.

А ещё можно примерно вот так:
create temp table dtest
(
 dt DATETIME YEAR TO SECOND 
) ;

create procedure reform_data( as_dt char(10))
returning DATETIME YEAR TO SECOND ;
define ls_dt char(10) ;
define dt date ;
	let ls_dt = as_dt[4,5] ||'/' || as_dt[1,2] ||'/' || as_dt[7,10];
	let dt = date(ls_dt) ;
return dt ;
END PROCEDURE;

insert into dtest execute procedure reform_data('29.10.2004') ;
29 окт 04, 19:46    [1072489]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
DNSokol
Member

Откуда: Ульяновск/Москва
Сообщений: 43
собственно так и сделал :( но всё-равно криво. неужели эта редиска совсем не под каким соусом не переваривает приведение дат? это-ж глупость какая-то
29 окт 04, 20:23    [1072535]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
cpr
Member

Откуда: Rostov-on-Don
Сообщений: 762
попробуй так

create table acc (acc char(20), dateopen date);

insert into acc values ('12345678901234567890',today);


select extend (dateopen, year to second )
from acc
1 ноя 04, 12:00    [1074499]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
RusS08
Member

Откуда: Москва
Сообщений: 31
Привет Димон.
На самом деле приведи в порядок переменные SERVER_LOCALE, DB_LOCALE, CLIENT_LOCALE. Насколько я помню, у вас с этим полнейший бардак. При приведении всего в нужный (актуальный) вид все работает наура. ОСТОРОЖНО!!! При неправильной установке переменный можешь привести часть данных в нечитаемый вид.
1 ноя 04, 18:53    [1076225]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
cpr
Member

Откуда: Rostov-on-Don
Сообщений: 762
Если на живой базе изменить переменные то вообще не подсоеденишься к ней потом.

если данные в бд находятся в неправильной локали, то
1 выгрузиться dbexport'ом
2 drop database
3 установить правильную локаль
4 создать и загрузить базу данных
причем данные в дбэкспорте могут быть и несовместимы по локали, и тут придется либо в момент загрузки менять DBDATE DBDEC итд. А если и это не поможет, то перекодировать данныэ дбэкспорта и загружать. Ибо никакой двоичный способ бэкапа не поможет если БД создана с неправильной локалью.
1 ноя 04, 19:10    [1076265]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
DNSokol
Member

Откуда: Ульяновск/Москва
Сообщений: 43
cpr
попробуй так
create table acc (acc char(20), dateopen date);
insert into acc values ('12345678901234567890',today);
select extend (dateopen, year to second )
from acc

со вставкой today никаких проблем нет. CURRENT тоже всё нормально. проблемы именно с тем, что бы заинсертить строчку - вида TO_DATE('26.09.04','%Y.%m.%d'). на TO_DATE - иллегал чарактер :(
7 ноя 04, 17:21    [1089120]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Julian
Member

Откуда: Минск
Сообщений: 55
IDS 9.21:

create temp table tt ( f1 date );
insert into TT values ( TO_Date('01.08.2003', '%d.%m.%Y') );
insert into TT select TO_Date('02.08.2003', '%d.%m.%Y')
from systables where tabid=1;
select * from TT;

f1
----------
2003-08-01
2003-08-02

2 Row(s) affected

Для IDS 7.3 по крайней мере второй вариант должен работать.
9 ноя 04, 01:27    [1090132]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Alevtin
Member

Откуда: Minsk
Сообщений: 53
Послушай, ну если у тебя это уже строка так сформируй ее заранее в том виде в каком надо. Т.е. на вход insert отдай ее уже как "2004-07-19 00:00:00"
На чем ты вообще все это пишешь? Ведь не голые SQL запросы у тебя идут. А если есть переменная, так подготовь ее заранее. И для этого вовсе не надо прогонять ее через темповую таблицу с полем date.

To Julian - он хочет не в date вставить значение, а в datetime year to second
9 ноя 04, 10:12    [1090449]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Julian
Member

Откуда: Минск
Сообщений: 55
Alevtin
To Julian - он хочет не в date вставить значение, а в datetime year to second

Я был невнимателен.
Все равно, работает преобразование типов:

create temp table tt ( f1 datetime year to second );
и дальше без изменений, включая
2 Row(s) affected
(9.2)
9 ноя 04, 22:12    [1092996]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Alevtin
Member

Откуда: Minsk
Сообщений: 53
Julian

Все равно, работает преобразование типов:

create temp table tt ( f1 datetime year to second );
и дальше без изменений, включая
2 Row(s) affected
(9.2)


(9.2) вот в этой маленькой приписке все дело :-) А ему надо под 7.31 А там то и не работает. Я уже пробовал извратиться как только мог, через несколько преобразований вложенных делал, но под 7.31 не работает. Работает, только если делаешь инсерт через селект.
10 ноя 04, 11:19    [1093723]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
DNSokol
Member

Откуда: Ульяновск/Москва
Сообщений: 43
Alevtin

(9.2) вот в этой маленькой приписке все дело :-) А ему надо под 7.31 А там то и не работает. Я уже пробовал извратиться как только мог, через несколько преобразований вложенных делал, но под 7.31 не работает. Работает, только если делаешь инсерт через селект.

немного пропал - был в отгулах, пьянствовал :D
во-во :) в этой пометочке и вся соль. Объясняю, почему хотел возложить преобразования дат на сервак: исходная строка у меня всегда в заданном формате, а вот какой формат на сервере - вопрос. У нас они и под Win и под *nix. Форматы там разные. Что бы не заморачиваться - хотел сервак напрячь - пусть сам разбирает, что ему надо... не тут то было... Итого - решил пойти по самому лёгкому пути, хотя читаемось данных и упала (ессно не в конечном приложении, а в самой таблице). Пихаю в сервак char(17) YYYYMMDDHHmmssttt. тупо - но работает. ну и клиента пришлось переписать.
19 ноя 04, 13:41    [1120513]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
DNSokol
[quot Alevtin]
формате, а вот какой формат на сервере - вопрос. У нас они и под Win и под *nix.

В каком формате на сервере по барабану, главное чему равна DBDATE на клиенте.
DBDATE=DMY4 == dd.mm.yyyy
19 ноя 04, 14:01    [1120672]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Alevtin
Member

Откуда: Minsk
Сообщений: 53
Понятно, но Журавлев Денис прав, сервера здесь ни при чем, просто на тех машинах на которых у тебя будет работать твое ПО пропиши в клиенте (если под виндой) или в переменных среды пользователя (если под unix-сом) DBDATE=DMY4
И тогда у тебя можно будет однозначно интерпретировать дату как dd.mm.yyyy
А datetime, так тот вообще вроде как одинаков и под виндовым informix-ом и под unix-овым.
19 ноя 04, 14:58    [1121066]     Ответить | Цитировать Сообщить модератору
 Re: Insert и DATETIME  [new]
Alevtin
Member

Откуда: Minsk
Сообщений: 53
Кстати, можно прописать переменную прамо в программе. Например, если ты пишешь на СИ то строка putenv("DBDATE=DMY4"); опишет тебе переменную локально для данного коннекта и не надо будет беспокоится о настройках клиента.
19 ноя 04, 15:06    [1121107]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить