如何在 PostgreSQL 中保存生日日期?
Posted
技术标签:
【中文标题】如何在 PostgreSQL 中保存生日日期?【英文标题】:How to save birthday date in 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
列
【参考方案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”而不是“字符串”,当使用这个(最后一个)方法时。
【讨论】:
以上是关于如何在 PostgreSQL 中保存生日日期?的主要内容,如果未能解决你的问题,请参考以下文章