Функция TO_DATE между PostgreSQL 8.2 и 8.3
Как мы все знаем, PostgreSQL 8.3 обеспечивает очень строгую проверку типов данных, из-за этого многие приложения сталкиваются с ошибками многих типов данных после миграции с PostgreSQL8.x на PostgreSQL8.3. В основном это вызвано проверкой типа данных.
Одна из частых ошибок - функция to_date (). Он принимает два текста в качестве параметров.
to_date(text,text)
Хорошо, теперь я создаю следующую таблицу. Простой вызов таблицы n_url_test содержит createddate как тип данных timestamp.
CREATE TABLE n_url_test ( urltestid bigserial NOT NULL, createddate timestamp without time zone DEFAULT now(), CONSTRAINT n_url_to_test_pkey PRIMARY KEY (urltestid) )
Я запускаю следующий sql в PostgreSQL8.2, он возвращает мой ожидаемый результат в формате «ГГГГ-ММ-ДД».
--PostgreSQL 8.2 --------------- select to_date(createddate,'YYYY-MM-DD') from n_url_test;
Однако после того, как я перешел на PostgreSQL8.3, я получил следующую ошибку
--PostgreSQL 8.3 --------------- select to_date(createddate,'YYYY-MM-DD') from n_url_test; -------------------------------------------------------------------------------- ERROR: function to_date(timestamp without time zone, unknown) does not exist LINE 1: select to_date(createddate,'YYYY-MM-DD') from n_url_test ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ********** Error **********
PostgreSQL 8.3 не будет автоматически преобразовывать метку времени в текст, как это было в предыдущей версии. Нам нужно явное приведение типов createddate, как показано ниже
--PostgreSQL 8.3 --------------- select to_date(createddate::text,'YYYY-MM-DD') from n_url_test;
Добавление::text к createddate явным образом преобразует тип данных в текст, это работа. PostgreSQL8.3 strictly checking on data type is good function , but please do not forget there still have a lot people using previous version. Это вызывает много проблем, если приложение основано на дизайне, игнорируя проверку типов данных, как я упоминал выше.