在 PostgreSQL 数据库中保存日期和时间的最佳方法

Posted

技术标签:

【中文标题】在 PostgreSQL 数据库中保存日期和时间的最佳方法【英文标题】:Best way to save date and time in a PostgreSQL database 【发布时间】:2018-05-25 21:29:48 【问题描述】:

我将在我的 PostgreSQL 数据库中保存日期和时间,然后以适当的格式获取并显示给用户。

假设应用程序用户位于伊朗并使用 Jalali 日期/时间系统。上半年伊朗时间为UTC+04:30,其余时间为UTC+03:30。事实上,夏令时在伊朗使用。

重要提示:有时我们会做出决定并将数据库服务器的位置从伊朗更改为欧洲或其他地方。

现在我有一些问题:

    哪种数据类型更便于保存日期和时间TIMESTAMP (TIMESTAMP WITHOUT TIMEZONE) 还是 TIMESTAMPZ (TIMESTAMP WITH TIME ZONE)?

    哪种数据类型更方便只节省时间TIMETIME WITH TIME ZONE?

    哪种数据类型更方便保存仅日期DATE (Gregorian) String (Jalali) 还是自定义数据类型?

    如何为我们的数据库设置一次 TIMEZONE?我想为数据库一次设置 TIMEZONE,然后在 TIMESTAMPZ 列上的所有查询都将在该 TIMEZONE 内保存和获取,并且它也被认为是夏令时?

    当我想保存当前日期和时间时,什么 SQL 查询最好?

    a- INSERT INTO test(d) VALUES(now());

    b- INSERT INTO test(d) VALUES(now() at time zone 'utc');

    c- INSERT INTO test(d) VALUES(now() at time zone 'Asia/Tehran');

    d- INSERT INTO test(d) VALUES(current_timestamp);

    e- INSERT INTO test(d) VALUES(now() at time zone 'utc');

    f- INSERT INTO test(d) VALUES(now() at time zone 'Asia/Tehran');

    数字 5-c 和 5-f 在保存时是否考虑夏令时?

    当数据库具有“亚洲/德黑兰”时区时,数字 5-a 和 5-d 是否保存在“亚洲/德黑兰”中?

    当我想从数据库中查询时,什么选项最适合我的情况?

    a- 从测试中选择 d;

    b- SELECT d at time zone 'utc' FROM test;

    c- SELECT d at time zone 'Asia/Tehran' FROM test;

    7-c 号算不算夏令时?

    当数据库具有“亚洲/德黑兰”时区时,数字 7-a 是否被视为“亚洲/德黑兰”时区和夏令时?

如果我最好使用时间戳来保存日期/时间,那么我必须为其添加夏令时并将其转换为 Jalali 日期时间并将其显示给用户,反之亦然。

【问题讨论】:

带时区的时间戳始终以 UTC 保存 - 夏季时间无关紧要。不过,postgres 会在输出时对其进行格式化,考虑夏季和所有时间。因此,您最好对所有三个都使用 Timestamtz,并使用适当的格式选择完整、仅日期和仅时间 @VaoTsun 谢谢。因此,如果我选择 TIMESTAMPZ,当我们从数据库查询时,它还会考虑夏令时吗?这个效果数据已经保存了吗?请问您也回答第四个问题吗? (我现在添加第四个问题) 【参考方案1】:

https://www.postgresql.org/docs/current/static/datatype-datetime.html

对于带时区的时间戳,内部存储的值始终在 UTC(通用协调时间,传统上称为格林威治标准时间) 时间,格林威治标准时间)。指定了明确时区的输入值是 使用该时区的适当偏移量转换为 UTC。如果 输入字符串中没有说明时区,则假定为 在系统的 TimeZone 参数指示的时区,并且是 使用时区的偏移量转换为 UTC。

当一个带有时区值的时间戳被输出时,它总是 从 UTC 转换为当前时区,并显示为 该区域的当地时间。要查看另一个时区的时间,要么 更改时区或使用 AT TIME ZONE 构造

    时间戳 timestamptz 并仅选择日期 timestamptz 和仅选择时间 无论您的语言环境或设置如何,数据库都会以 UTC 格式保存 tz 感知时间戳。戳记始终转换为 UTC,通过 TimeZone 参数对其进行调整。每次显示数据时都会发生相同的反转换。服务器的TimeZone 只是默认值,如果客户端没有指定,则使用。数据库TimeZone 会覆盖 postgresql.conf 中指定数据库的那个,但客户端设置仍然会覆盖数据库设置。

【讨论】:

谢谢。客户端设置在哪里?在控制面板或系统设置中? 既不是,也不是。这取决于客户。但基本上,请查看postgresql.org/docs/current/static/… 和更短的时间(不确定是正还是负)postgresql.org/docs/current/static/sql-set.html 谢谢。我真的很感激你。您能回答我现在刚刚添加到第一篇文章中的最后一个问题吗? (问题 5-10)。非常感谢

以上是关于在 PostgreSQL 数据库中保存日期和时间的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 中保存生日日期?

昨天 - 在 Redshift 和 PostgreSQL 中 - 日期添加兼容性

postgresql数据库中判断是否是数字和日期时间格式函数

postgresql数据库怎样对查询出的结果按日期时间排序

如何从 SQLite3 和 PostgreSQL 中的时间戳中选择日期

Postgresql:在playframework 1.x中选择两个日期之间的所有数据