Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Insert и DATETIME / 17 сообщений из 17, страница 1 из 1
29.10.2004, 17:30
    #32761568
DNSokol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Привет всем.
Столкнулся с такой проблемой - есть табличка, одно из полей которой - DATETIME (YEAR TO SECOND). Нужно сделать туды insert. Есть стока даты в немецком формате dd.mm.yyyy. Вопрос - как это сделать? insert не под каким соусом не хочет фидеть среди значений конструкцию вида TO_DATE('26.12.2003','%d.%m.%Y'). Упорно кричит, что синтакс еррор. Хотя если эту конструкцию загнать в селект, то она замечательно переваривается. Как решить эти грабли? Моё решение уж очень корявое. Делаю темповую таблицу, где вместо поля с датой - строка, затем инсертю туда нужные данные, а затем делаю INSERT INTO XXX SELECT. И уже внутри селекта делаю приобразование. Но это де криво. Что это за инсерт такой получается?
Ах, да, сервак - Informix 7.31
...
Рейтинг: 0 / 0
29.10.2004, 17:43
    #32761599
Dedushka Mazai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
кажися ему надо передавать датавремя в виде '00:00:00 26.12.2003'
...
Рейтинг: 0 / 0
29.10.2004, 19:14
    #32761774
DNSokol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
стрянно. Ведь функция TO_DATE превращает строковое значение во внутренний формат даты информикса (т.е. в кол-во секунд, начиная с даты XXXX). Тама 2 параметра - собственно строка и её формат. Только вот он эта глупая железяка не хочет видеть внутри INSERT эту самую присловутую TO_DATE
...
Рейтинг: 0 / 0
29.10.2004, 19:46
    #32761814
Enlighten me
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Код: plaintext
1.
2.
3.
4.
5.
create temp table dtest
(
 dt DATETIME YEAR TO SECOND 
) ;

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

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

А ещё можно примерно вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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') ;
...
Рейтинг: 0 / 0
29.10.2004, 20:23
    #32761845
DNSokol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
собственно так и сделал :( но всё-равно криво. неужели эта редиска совсем не под каким соусом не переваривает приведение дат? это-ж глупость какая-то
...
Рейтинг: 0 / 0
01.11.2004, 12:00
    #32762836
cpr
cpr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
попробуй так

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

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


select extend (dateopen, year to second )
from acc
...
Рейтинг: 0 / 0
01.11.2004, 18:53
    #32763942
RusS08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Привет Димон.
На самом деле приведи в порядок переменные SERVER_LOCALE, DB_LOCALE, CLIENT_LOCALE. Насколько я помню, у вас с этим полнейший бардак. При приведении всего в нужный (актуальный) вид все работает наура. ОСТОРОЖНО!!! При неправильной установке переменный можешь привести часть данных в нечитаемый вид.
...
Рейтинг: 0 / 0
01.11.2004, 19:10
    #32763976
cpr
cpr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Если на живой базе изменить переменные то вообще не подсоеденишься к ней потом.

если данные в бд находятся в неправильной локали, то
1 выгрузиться dbexport'ом
2 drop database
3 установить правильную локаль
4 создать и загрузить базу данных
причем данные в дбэкспорте могут быть и несовместимы по локали, и тут придется либо в момент загрузки менять DBDATE DBDEC итд. А если и это не поможет, то перекодировать данныэ дбэкспорта и загружать. Ибо никакой двоичный способ бэкапа не поможет если БД создана с неправильной локалью.
...
Рейтинг: 0 / 0
07.11.2004, 17:21
    #32772029
DNSokol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
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 - иллегал чарактер :(
...
Рейтинг: 0 / 0
09.11.2004, 01:27
    #32772666
Julian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
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 по крайней мере второй вариант должен работать.
...
Рейтинг: 0 / 0
09.11.2004, 10:12
    #32772892
Alevtin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Послушай, ну если у тебя это уже строка так сформируй ее заранее в том виде в каком надо. Т.е. на вход insert отдай ее уже как "2004-07-19 00:00:00"
На чем ты вообще все это пишешь? Ведь не голые SQL запросы у тебя идут. А если есть переменная, так подготовь ее заранее. И для этого вовсе не надо прогонять ее через темповую таблицу с полем date.

To Julian - он хочет не в date вставить значение, а в datetime year to second
...
Рейтинг: 0 / 0
09.11.2004, 22:12
    #32774505
Julian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
AlevtinTo Julian - он хочет не в date вставить значение, а в datetime year to second
Я был невнимателен.
Все равно, работает преобразование типов:

create temp table tt ( f1 datetime year to second );
и дальше без изменений, включая
2 Row(s) affected
(9.2)
...
Рейтинг: 0 / 0
10.11.2004, 11:19
    #32775009
Alevtin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Julian
Все равно, работает преобразование типов:

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

(9.2) вот в этой маленькой приписке все дело :-) А ему надо под 7.31 А там то и не работает. Я уже пробовал извратиться как только мог, через несколько преобразований вложенных делал, но под 7.31 не работает. Работает, только если делаешь инсерт через селект.
...
Рейтинг: 0 / 0
19.11.2004, 13:41
    #32791306
DNSokol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Alevtin
(9.2) вот в этой маленькой приписке все дело :-) А ему надо под 7.31 А там то и не работает. Я уже пробовал извратиться как только мог, через несколько преобразований вложенных делал, но под 7.31 не работает. Работает, только если делаешь инсерт через селект.
немного пропал - был в отгулах, пьянствовал :D
во-во :) в этой пометочке и вся соль. Объясняю, почему хотел возложить преобразования дат на сервак: исходная строка у меня всегда в заданном формате, а вот какой формат на сервере - вопрос. У нас они и под Win и под *nix. Форматы там разные. Что бы не заморачиваться - хотел сервак напрячь - пусть сам разбирает, что ему надо... не тут то было... Итого - решил пойти по самому лёгкому пути, хотя читаемось данных и упала (ессно не в конечном приложении, а в самой таблице). Пихаю в сервак char(17) YYYYMMDDHHmmssttt. тупо - но работает. ну и клиента пришлось переписать.
...
Рейтинг: 0 / 0
19.11.2004, 14:01
    #32791375
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
DNSokol[quot Alevtin]
формате, а вот какой формат на сервере - вопрос. У нас они и под Win и под *nix.
В каком формате на сервере по барабану, главное чему равна DBDATE на клиенте.
DBDATE=DMY4 == dd.mm.yyyy
...
Рейтинг: 0 / 0
19.11.2004, 14:58
    #32791588
Alevtin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Понятно, но Журавлев Денис прав, сервера здесь ни при чем, просто на тех машинах на которых у тебя будет работать твое ПО пропиши в клиенте (если под виндой) или в переменных среды пользователя (если под unix-сом) DBDATE=DMY4
И тогда у тебя можно будет однозначно интерпретировать дату как dd.mm.yyyy
А datetime, так тот вообще вроде как одинаков и под виндовым informix-ом и под unix-овым.
...
Рейтинг: 0 / 0
19.11.2004, 15:06
    #32791614
Alevtin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert и DATETIME
Кстати, можно прописать переменную прамо в программе. Например, если ты пишешь на СИ то строка putenv("DBDATE=DMY4"); опишет тебе переменную локально для данного коннекта и не надо будет беспокоится о настройках клиента.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Insert и DATETIME / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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