Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
661 views
in Technique[技术] by (71.8m points)

Postgresql 日期时间怎么以yyyy/MM/dd HH:mm:ss形式存储

### 问题描述
项目需要将时间类型以yyyy/MM/dd HH:mm:ss形式存储,postgresql用的不多,数据库版本用的是96版本的不知道怎么设置


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

建议题主还是回头再梳理一下项目的真正需求是什么吧,对于你所说的需求

项目需要将时间类型以yyyy/MM/dd HH:mm:ss形式存储

以我个人经验判断,这多半是一个伪需求。因为正常的业务需求应该是“所有时间戳的展示应该统一遵循yyyy/MM/dd HH:mm:ss” 这样的格式,很少会有需求方会将需求定义到把时间戳的存储格式。

倒也不是说没见过时间戳这么存的,但是如果时间戳真的按照“yyyy/MM/dd HH:mm:ss”这样的字符串形式来存,一来存储太浪费了(你可以算算存一个时间戳需要多少字节),而来以字符串来做索引的话效率不会太高。

通常的最佳实践是:

  • 时间戳在数据库中的存储使用内置的时间类型进行存储。以PostgreSQL为例,就是使用其TIMESTAMP类型存储(8字节). 如果业务应用涉及到跨时区的数据,那么可以考虑使用TIMESTAMP WITH TIME ZONE类型(10字节)
  • 时间戳数据在程序内部四处传递时,按照程序语言支持的映射类型进行传递。不要过早转换成字符串,以免增加数据传递成本以及数据处理复杂度(如果程序语言没有对应的映射类型,直接用原生的8字节数值类型传递亦可)
  • 当时间戳数据需要展示给人看的时候才去做格式化处理。这种处理可以根据具体需要从以下两个层面选择转换的具体方法

    • 在数据库层面进行处理。比如在PostgreSQL中对TIMESTAMP类型调用其UDF to_char()进行格式化转换
    • 在应用程序层面通过程序语言的相关库函数进行格式化转换。比如Java的SimpleDateFormat#format()方法

此外,关于PG中TIMESTAMP类型的使用,我以前也做过下述回答,可供参考:


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...