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

时间:2017-12-12 08:52:19

标签: postgresql sqldatatypes

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

假设应用程序用户位于伊朗并使用 Jalali日期/时间系统。在上半年,伊朗时间是UTC + 04:30,但在剩下的一年中,它是UTC + 03:30。事实上,在伊朗使用夏令时

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

现在我有一些问题:

  1. 哪种数据类型更方便保存日期与时间TIMESTAMPTIMESTAMP WITHOUT TIMEZONE)或TIMESTAMPZTIMESTAMP WITH TIME ZONE)?

  2. 哪种数据类型更方便保存仅限时间TIMETIME WITH TIME ZONE

  3. 哪种数据类型更方便保存仅限日期DATE(格里高利)String(Jalali)或自定义数据类型?

  4. 如何为我们的数据库设置一次TIMEZONE?我想将TIMEZONE设置为数据库一次,之后所有关于TIMESTAMPZ列的查询都将在该TIMEZONE中保存和获取,还会考虑夏令时吗?

  5. 当我想保存当前日期和时间时,哪种SQL查询最好?

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

    b- INSERT INTO test(d)VALUES(now()在时区'utc');

    c- INSERT INTO test(d)VALUES(现在()时区'亚洲/德黑兰');

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

    e- INSERT INTO test(d)VALUES(now()在时区'utc');

    f- INSERT INTO test(d)VALUES(现在()时区'亚洲/德黑兰');

  6. 保存与否时,5-c和5-f是否被视为夏令时?

  7. 当数据库有'亚洲/德黑兰'时区时,数字5-a和5-d是否保存在'亚洲/德黑兰'?

  8. 当我想从数据库查询时,在我的情况下哪些选项最好?

    a- SELECT d FROM test;

    b-在时区“utc”FROM测试中选择d;

    c-选择时区'亚洲/德黑兰'FROM测试;

  9. 7-c号是夏令时吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

  

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

     

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

  1. timestamptz
  2. timestamptz并仅选择日期
  3. timestamptz并仅选择时间
  4. 数据库以UTC格式保存tz感知时间戳,无论您的语言环境或设置如何。邮票总是转换为UTC,通过TimeZone参数进行调整。每次显示数据时都会发生相同的转换。服务器的TimeZone仅为默认值,如果客户端未指定任何值,则使用该值。数据库TimeZone会覆盖postgresql.conf中指定数据库的数据库,但客户端设置仍将覆盖数据库设置。