2016-07-27 3 views
1

Я выполняю следующее:Ошибка при использовании условного оператора с меткой времени в Postgres

create table test(id int not null, time timestamp with time zone); 
insert into test (id,time) values (1, case when 0=1 then '2016-07-27 11:53:16.908000 +03:00:00' end); 

Я получаю следующее сообщение об ошибке от Postgres:

ERROR: column "time" is of type timestamp with time zone but expression is of type text 
LINE 1: insert into test (id,time) values (1, case when 0=1 then '20... 
              ^ 

Что я делаю неправильно?

+0

Параметр 'case' не имеет никакого смысла. Что вы на самом деле пытаетесь сделать там? –

ответ

1

Попробуйте это:

insert into test (id,time) 
select 1, case when 0=1 then '2016-07-27 11:53:16.908000 +03:00:00' ::timestamp end 

Однако, так как в вашем случае условие всегда ложно то есть, 0 <> 1, следовательно, вы можете поставить значение по умолчанию или значение NULL в вашей временной колонке.

Если вы хотите, вы можете поместить значение по умолчанию, когда вы создаете таблицу, как

create table test(id int not null, 
times timestamp with time zone default now()); 

На стороне записки:

Старайтесь избегать имен ваших имен столбцов, которые keywords

+0

Hii .. Я уже упростил проблему, просто чтобы представить самый простой случай, который терпит неудачу. Im мой случай Я использую подготовленный оператор, чтобы он больше напоминал это: case when? = 1 then? –

+0

@EliGolin: - Вы можете в этом случае разрешить свою ошибку, отправив текстовую дату с отметкой времени. –

+0

Пожалуйста, посмотрите мой комментарий на @a_horse_with_no_name –

2

Внимательно прочитайте сообщение об ошибке, оно сообщит вам, в чем проблема: «, но выражение имеет тип текст "

Вам необходимо использовать правильную литеровочную метку времени.

'2016-07-27 11:53:16.908000 +03:00:00' является константой varchar (text), а не значением временной метки. Чтобы указать, использовать значение временной метки:

timestamp '2016-07-27 11:53:16.908000 +03:00:00' 

Так что ваша вставка должна выглядеть следующим образом:

insert into test 
    (id,time) 
values 
    (1, case when 0=1 then timestamp '2016-07-27 11:53:16.908000 +03:00:00' end); 
+0

O.k ... И почему временная метка - это особый случай? Почему то же самое с Int или Boolean работает нормально? –

+0

Тот факт, что я должен явно бросать, выглядит очень странно для меня по двум причинам: 1. Если я не использую условный оператор просто регулярным: Вставить в test (id, lastLogingDate) значения (1, '2016-07-27 11 : 53: 16.908000 +03: 00: 00 '), он отлично работает. 2. Я взаимодействую с postgres через jdbc, поэтому на самом деле у меня есть подготовленная statemend: insert into test (id, lastLoginDate) значения (?, Case when? = 1 then?). У меня есть следующий код на стороне клиента: conn.setInt (1,1) conn.setInt (2,0) conn.setTimestamp (3, новая отметка времени (бла-бла-бла)). Так зачем мне бросать? –

+0

Нет «отливки», так написано правильное литеральное время. Когда вы не сделаете этого, Postgres попытается неявно преобразовать константу 'varchar' в' timestamp', которая преуспеет в указанном формате.Выражение 'case' не имеет типа данных по умолчанию, и для этого вам нужно предоставить соответствующий литеральный экземпляр timestamp в выражении, чтобы Postgres мог его определить. Опираясь на неявное преобразование типов данных, это всегда плохая идея. –

Смежные вопросы