2016-04-06 3 views
0

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

to_date(date_of_birth,'YYYY-01-01') 

date_of_birth находится в формате ДД/ММ/ГГГГ, и имеет тип «текст»

ОДНАКО, я наткнулся на некоторые сумасшедшие случаи, когда у вас есть информация, как

//1980

Другой случай был:

0/0/1980

Когда я бегу мое решение, я получаю следующее сообщение об ошибке:

ERROR: invalid value "//19" for "YYYY" 
DETAIL: Value must be an integer. 

Моя цель на самом деле просто собрать за год, так что, по крайней мере последовательны. Как вы обрабатываете такие случаи с помощью Postgres?

EDIT:

Switched его на следующее:

to_date(date_of_birth,'01/01/YYYY') 

Мой запрос состоит в следующем:

SELECT to_date(date_of_birth,'01/01/YYYY') AS year, COUNT(*) AS yearTotal FROM student WHERE date_of_birth LIKE '%/%/1980' GROUP BY year; 

В результате получается, как это:

year | yeartotal ---------------+----------- 0030-01-01 | 3 0001-01-01 BC | 1

ответ

0

Проблема путем манипулирования информацией о дате (которая была строкового типа) в «YYYY» для того, чтобы получить доступ к надлежащей информации через date_part.

Используя «право» функцию PostgreSQL, я смог собрать год из строки, записанной в формате «DD/MM/YYYY», где право ('10/12/2013 ', 4) вернется в 2013 году ».

Мой запрос выглядит следующим образом:

SELECT date_part('year', to_date(right(date_of_birth,4),'YYYY')) AS year, COUNT(*) AS total FROM student GROUP BY year 

Другой способ, которым я мог бы решить эту проблему именно через регулярное выражение, гарантируя, что я работаю только с «действительными» заявления даты. Что-то вдоль линии (с использованием регулярных выражений Python в качестве примера):

regexp_matches(date_of_birth, '.\/.\/\d{4}') 
-1

попытка TO_CHAR вместо TO_DATE, он работал для меня

SELECT replace(date_of_birth,'//','') AS year, COUNT(*) AS yearTotal FROM student GROUP BY year; 
+0

Я получаю сообщение об ошибке: 'ОШИБКА: функция to_char (текст, неизвестен) не exist' – Adib

+0

Что формат даты в date_of_birth базы данных –

+0

Это текст, а формат - DD/MM/YYYY. Так, например, 5 октября 1980 года будет 05/10/1980. – Adib

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