postgres json解析到时间戳

Dav*_*son 1 postgresql json timestamp

我正在尝试从包含json转储的CSV文件中获取一些数据到我的postgres数据库中。只要是字符串,就可以了,但是我想将包含时间戳的字符串作为时间戳存储在postgres中。所以我需要对两个字段进行一些转换:registerdate和dateofbirth。除日期转换行外,以下代码有效。

有关如何将两个字符串成功转换为以下时间戳的任何线索:

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;
Run Code Online (Sandbox Code Playgroud)

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" : "bk_1164@test.email", "friends" : [ "KUE" ] } 
Run Code Online (Sandbox Code Playgroud)

Zig*_*ter 5

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" : "bk_1164@test.email", "friends" : [ "KUE" ] }'::jsonb as data) d
Run Code Online (Sandbox Code Playgroud)


rar*_*e01 5

您的 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 有一个选项OFhttps : //www.postgresql.org/docs/current/static/functions-formatting.html