Невозможно ввести дату в поле postgres с отметкой времени типа данных - PullRequest
4 голосов
/ 21 августа 2009

Я пытаюсь вставить дату («Это строка») в поле базы данных postgres. Я получаю следующую ошибку

ERROR:  invalid input syntax for type timestamp: ""

Вот мой код

$date = '2002-03-11';

$query = 'INSERT INTO dates(date) VALUES('.$pdo->quote($date).')';
$pdo->query($date);

Я понятия не имею, как это сделать?

Ответы [ 3 ]

9 голосов
/ 21 августа 2009

Вы пытаетесь вставить в метку времени. Вам нужно объединить время с датой. Из документации Postgres :

Допустимый ввод для типов отметок времени состоит из объединения даты и время, за которым следует необязательный часовой пояс, за которым следует дополнительный AD или до н. (В качестве альтернативы, AD / BC может появляются перед часовым поясом, но это не является предпочтительным порядком.) Таким образом

1999-01-08 04:05:06

и

1999-01-08 04:05:06 -8:00

действительны значения, которые соответствуют ISO 8601 стандарт.

Do:

$date = '2002-03-11 12:01AM';
5 голосов
/ 22 августа 2009

Кажется, в вашей ошибке четко указано, в чем проблема:

ERROR:  invalid input syntax for type timestamp: ""

Похоже, ваш запрос пытается вставить пустую строку в поле PostgreSQL, которое имеет тип 'timestamp'. Если вы вставили недопустимую строку какого-либо рода, она должна появиться в сообщаемой вами ошибке, например:

ERROR:  invalid input syntax for type timestamp: "foobardtimestamp"

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

ERROR:  invalid input syntax for type timestamp: "2002-03-11"

... но ошибка не говорит о том, что я подозреваю, что ваша строка на самом деле не передается на запрос, как вы думаете. Дело в том, что, как уже указывалось ранее: PostgreSQL должен прекрасно обрабатывать 2002-03-11 как допустимую строку метки времени.

PostgreSQL не любит вставлять '' (пустую строку) в качестве метки времени и будет жаловаться на предоставленную вами ошибку.

Если вы хотите указать пустую строку, вы должны быть уверены, что у вас нет ограничения NOT NULL на столбец, и вам нужно использовать null вместо пустой строки. Если вы не хотите отправлять пустую строку, я бы проверил значение $pdo->quote($date), чтобы убедиться, что вы получаете строку, которую хотите получить из этого.

Вы также можете попытаться вывести сгенерированный SQL до того, как вы фактически запустите запрос, чтобы убедиться, что он выглядит правильно. У меня есть чувство, если вы это сделаете, это будет выглядеть примерно так:

INSERT INTO dates(date) VALUES('')

Кроме того, ваш пример говорит, что вы работаете: $pdo->query($date); когда я совершенно уверен, что вы хотите: $pdo->query($query);

5 голосов
/ 21 августа 2009

Я не уверен, почему вы получаете эту ошибку, при этом значение в кавычках пусто, как это. PostgreSQL, безусловно, прекрасно принимает даты без времен в поля меток времени. По умолчанию используется время «00:00:00», начало этого дня.

CREATE TABLE dates("date" timestamp);
INSERT INTO dates (date) VALUES ('2002-03-11');
SELECT * from dates;
        date         
---------------------
2002-03-11 00:00:00

Есть пара вещей, которые вы здесь делаете, но они не совсем правильны, и одна из них может улучшить вашу ситуацию:

  • Использование «кавычек» вместо подготовленных операторов в реальном приложении - это первый шаг к разрешению атак с использованием SQL-инъекций в ваш код, это плохая привычка. Тот факт, что вы получаете здесь ошибку, заставляет меня задуматься, что PDO делает что-то не так в середине, что будет менее вероятно, если вы подготовите оператор и передадите значение более напрямую.
  • Вы действительно должны приводить это непосредственно от строки к метке времени, а не зависеть от неявного приведения здесь. Пример в прямом SQL:

    INSERT INTO dates (date) VALUES (cast('2002-03-11' as timestamp));
    
  • 'date' - это зарезервированное слово SQL . Вы не должны называть поля подобным образом, потому что вам может понадобиться заключить ссылки на имя в кавычки, чтобы их можно было правильно проанализировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...