PostgreSQL выводит формат TimeStamp, отличный от Javascript Формат TimeStamp - PullRequest
1 голос
/ 02 апреля 2020

У меня проблемы с привязкой результатов SQL к моей модели в Javascript /Typescript.

В моей модели у меня есть свойство created_at с типами Date.

Когда я использую функции JSON в операторе Postgres SQL, чтобы избежать дублирования родительских строк для отношения, я получу другой формат для отметки времени.

Вот простой пример

SELECT
   a.*,
   (
      SELECT
         ROW_TO_JSON(profile) 
      FROM
         (
            SELECT
               *
            FROM
               profile p 
            WHERE
               p.account_id = a.id 
         )
         profile 
   )
   AS profile 
FROM
   account a 
WHERE
   a.id = 16

А вот результаты в JSON

{
   "id":16,
   "email":"test@gmail.com",
   "password":"$password",
   "role_id":0,
   "created_at":"2020-04-01T22:03:44.324Z",
   "profile":{
      "id":8,
      "username":"firmanjml",
      "gender":0,
      "bio":null,
      "avatar":"www.firmanjml.me/test.jpg",
      "account_id":16,
      "created_at":"2020-04-02T06:03:44.32498"
   }
}

Я заметил, что родительская строка из таблицы счетов имеет Z в конце created_at, тогда как дочерняя таблица, которая преобразуется в JSON, имеет другой формат отметки времени.

Можно ли сделать так, чтобы все отметки времени были в формате Javascript?

Запрос на создание схемы и вставьте данные

CREATE TABLE "account"(
    id SERIAL primary key,
    email varchar(50) not null,
    password varchar(50) not null,
    role_id int2 default 0 not null, 
    created_at timestamp default now() not null
);

CREATE TABLE "profile"(
    id SERIAL primary key,
    username varchar(50) not null,
    gender int2 not null,
    bio varchar(50),
    avatar varchar(50),
    account_id integer not null REFERENCES account (id),
    created_at timestamp default now() not null
);

INSERT INTO "account" (email,"password","role_id",created_at) VALUES 
('test@gmail.com','$password',0,'2020-04-02 06:03:44.324');

INSERT INTO "profile" (username,gender,bio,avatar,account_id,created_at) VALUES 
('fimrnajml',0,NULL,'www.firmanjml.me/test.jpg',1,'2020-04-02 06:03:44.324');

1 Ответ

1 голос
/ 02 апреля 2020

Используйте функцию TO_CHAR () для форматирования отметки времени в вашем SQL, например https://www.postgresqltutorial.com/postgresql-to_char/

Формат 'YYYY-MM-DD "T" HH24: MI : SS.US "Z" 'должен это сделать. Предполагается, что все ваши метки времени в UT C (как это делают профессионалы: -)

Ваш SQL выглядит следующим образом:

SELECT
   a.*,
   (
      SELECT
         ROW_TO_JSON(profile) 
      FROM
         (
            SELECT
               username,gender,bio,avatar,account_id,to_char(created_at, 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"') created_at
            FROM
               profile p 
            WHERE
               p.account_id = a.id 
         )
         profile 
   )
   AS profile 
FROM
   account a
WHERE
   a.id = 16

попробуйте здесь

...