【问题标题】:How to save birthday date in PostgreSQL?如何在 PostgreSQL 中保存生日日期?
【发布时间】:2019-12-26 01:25:50
【问题描述】:

我正在做一个 GraphQL 教程,我需要保存用户的生日。我正在使用 TypeORM、Apollo-server-express 和 PostgreSQL。

这些是我当前的用户实体和架构文件。我不知道如何保存/输入生日,所以我现在设置为nullable

// user.entity.ts

@Entity()
export class User extends BaseEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column('text')
  first_name: string;

  @Column('text')
  last_name: string;

  @Column({
    unique: true
  })
  @Length(5, 100)
  @IsEmail()
  email: string;

  @Column()
  password: string;

  @Column({
    nullable: true
  })
  birthday: Date;
}
// user.schmea.ts

  type User {
    id: ID!
    first_name: String
    last_name: String!
    email: String!
    birthday: Date
    created_at: Date @date(format: "HH:MM mmmm d, yyyy")
    updated_at: Date @date(format: "HH:MM mmmm d, yyyy")
  }

  input CreateUserInput {
    first_name: String
    last_name: String!
    email: String!
    password: String!
    birthday: Date
  }

这是我的示例 mutation 输入 createUser

mutation {
  createUser(data: {
    first_name: "Some",
    last_name: "One",
    email: "some@one.com",
    password: "hashThisPlease1"
  }) {
    id
    first_name
    last_name
    email
  }
}

我应该输入birthday 作为string"1990-12-30" 吗?这是在PostgreSQL中保存birthday列的标准方法吗?

请帮忙。

【问题讨论】:

  • 保存为时间戳有什么问题?
  • 在数据库中使用date

标签: node.js postgresql graphql apollo typeorm


【解决方案1】:

生日通常保存为日期,大多数数据库(包括 Postgres)都支持日期 (see docs)。 您只需将生日装饰器更改为:

  @Column({
    type: 'date',
    nullable: true
  })
  birthday: Date | null;

【讨论】:

    【解决方案2】:

    我绝不是专家,但我同意 JudgeFudge 的观点。 虽然我想补充一点,但您可以选择将属性类型设置为“字符串”:

    @Column({ type: "date" })
    date_of_birth: string;
    

    然后你会得到(在我看来)更好理解的错误信息:

    "Datum/Zeit-Feldwert ist außerhalb des gültigen Bereichs: »1986-20-25«" 
    ("Date/Time field value is not in valid range")
    

    代替:

    "ungültige Eingabesyntax für Typ date: »NaN-NaN-NaN«" 
    ("invalid input syntax for type date")
    

    如果您输入:"1986-02-30" 属性类型为"string",您将收到类似上述的错误,而属性类型为"Date" 时,由于javascript Date 构造函数,它会将其转换为"1986-03-02"

    但是你可以失去一些“模式透明度”,因为你要求一个类型为“字符串”而不是“日期”的值,例如当我像我一样使用 TypeGraphQl 时 并在 Args/Input-Types 中实现实体部分。

    即将结束,如果您的请求包含 DateObject 的字符串化(到 JSON)实例,则在尝试使用 DateObject 构造函数初始化此实例时将捕获无效日期,因此您可以使用“Date”而不是“字符串”,当使用这个(最后一个)方法时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2014-10-01
      相关资源
      最近更新 更多