【发布时间】:2018-05-25 21:29:48
【问题描述】:
我将在我的 PostgreSQL 数据库中保存日期和时间,然后以适当的格式获取并显示给用户。
假设应用程序用户位于伊朗并使用 Jalali 日期/时间系统。上半年伊朗时间为UTC+04:30,其余时间为UTC+03:30。事实上,夏令时在伊朗使用。
重要提示:有时我们会做出决定并将数据库服务器的位置从伊朗更改为欧洲或其他地方。
现在我有一些问题:
哪种数据类型更便于保存日期和时间?
TIMESTAMP(TIMESTAMP WITHOUT TIMEZONE) 还是TIMESTAMPZ(TIMESTAMP WITH TIME ZONE)?哪种数据类型更方便只节省时间?
TIME或TIME 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,当我们从数据库查询时,它还会考虑夏令时吗?这个效果数据已经保存了吗?请问您也回答第四个问题吗? (我现在添加第四个问题)