2016-06-06 10 views
1

Я пытаюсь получить некоторые данные в моем postgres DB из файла CSV, содержащего дамп json. Пока это просто строки, все в порядке, но я хочу, чтобы строки, содержащие временные метки, сохранялись как отметки времени в postgres. Су, мне нужно сделать некоторые преобразования двух полей: registerdate и dateofbirth. Ниже код работает для линий преобразования даты, за исключением ...postgres json parse to timestamp

Любой ключ о том, как успешно преобразовать две строки в метки времени ниже:

CREATE TABLE users (
    id SERIAL, 
    mongo_id TEXT, 
    password VARCHAR(128), 
    firstname VARCHAR(200), 
    lastname VARCHAR(200), 
    dateofbirth TIMESTAMP, 
    registerdate TIMESTAMP, 
    displayname VARCHAR(200), 
    language VARCHAR(200), 
    country VARCHAR(200), 
    profilepicture VARCHAR(200), 
    backgroundpicture VARCHAR(200), 
    type VARCHAR(200), 
    sex VARCHAR(6), 
    offlinemode BOOLEAN, 
    email VARCHAR(200), 
    friends VARCHAR(255)[] 
); 

INSERT INTO users (mongo_id, password,firstname,lastname, dateofbirth, registerdate, displayname, language) 
SELECT data->>'_id', 
data->>'password', 
    data->>'firstName', 
    data->>'secondName', 
    to_timestamp(data->'dateOfBirth'->>'$date'), /*<------*/ 
    to_timestamp(data->'registerDate'->>'$date'), /*<-------*/ 
     data->>'displayName', 
     data->>'language' 
FROM import.mongo_users; 

Формат данных в mongo_users:

{ "_id" : "1164", "password" : "aaa123123", "firstName" : "Adam", "secondName" : "Kowlalski", "dateOfBirth" : { "$date" : "2014-05-18T07:41:09.202+0200" }, "registerDate" : { "$date" : "2016-06-01T12:59:53.941+0200" }, "displayName" : "Adam Kowlalski", "language" : "nb", "country" : null, "profilePicture" : null, "backgroundPicture" : null, "type" : "USER", "sex" : "MALE", "offlineMode" : true, "email" : "[email protected]", "friends" : [ "KUE" ] } 

ответ

0

Функция to_timestamp возвращает два параметра: date_time в текстовом формате и шаблон форматирования.

Вам не нужно использовать to_timestamp, так как ваши значения даты и времени уже отформатированы с допустимой меткой времени, а PostgreSQL хорошо знает временные метки в формате json. Следующие работы также:

SELECT data->>'_id', 
data->>'password', 
    data->>'firstName', 
    data->>'secondName', 
    (data->'dateOfBirth'->>'$date')::timestamp, --<< simply cast to timestamp 
    (data->'registerDate'->>'$date')::timestamp, --<< simply cast to timestamp 
     data->>'displayName', 
     data->>'language' 
FROM (SELECT 
'{ "_id" : "1164", "password" : "aaa123123", "firstName" : "Adam", "secondName" : "Kowlalski", "dateOfBirth" : { "$date" : "2014-05-18T07:41:09.202+0200" }, 
    "registerDate" : { "$date" : "2016-06-01T12:59:53.941+0200" }, "displayName" : "Adam Kowlalski", "language" : "nb", "country" : null, "profilePicture" : null, 
    "backgroundPicture" : null, "type" : "USER", "sex" : "MALE", "offlineMode" : true, "email" : "[email protected]", "friends" : [ "KUE" ] }'::jsonb as data) d 
0

Ваш JSON формат дата выглядит как ISO 8601 (https://en.wikipedia.org/wiki/ISO_8601). Для преобразования входной строки в переменную даты вы должны использовать функцию to_date.

например. to_date(data->'dateOfBirth'->>'$date','YYYY-MM-DD"T"HH24:MI:SS')

Будьте уверены, что вам нужно проверить, играют ли различия в часовом поясе. Postgresql имеет возможность OF: https://www.postgresql.org/docs/current/static/functions-formatting.html

+0

Обратите внимание, что в данном конкретном случае она также содержит данные часового пояса ('+ 0200'), так что шаблон будет отбрасывать эту информацию (хотя это может быть излишним в любом случае, в данном конкретном случае) –

+1

спасибо, я добавил подсказку – rarspace01