sql - 如何使用时间戳正确处理夏令时

标签 sql postgresql timezone dst timestamp-with-timezone

我正在尝试在 Postgres 中创建一个表,用于存储在接下来的几年中每天每整小时发生一次的事件。所以我使用以下表达式填充了一个列:

INSERT INTO tablename(time) 
SELECT CAST('2013-01-01' AS DATE) + (n || ' hour')::INTERVAL 
 FROM generate_series(0, 100000) n;

作为该列的数据类型,我选择了带时区的时间戳,并希望以这种方式自动考虑夏令时。 (顺便说一句,我的默认时区是 CET,所以当 DST 应用时它是 UTC+1 或 UTC+2)。作为上述查询的结果,我得到了这个:

  • 2013-03-31 00:00:00 +01
  • 2013-03-31 01:00:00 +01
  • 2013-03-31 03:00:00 +02
  • 2013-03-31 03:00:00 +02
  • 2013-03-31 04:00:00 +02
  • ...
  • 2013-10-27 00:00:00 +02
  • 2013-10-27 01:00:00 +02
  • 2013-10-27 02:00:00 +01
  • 2013-10-27 03:00:00 +01
  • 2013-10-27 04:00:00 +01
  • ...

UTC 的偏移量发生变化,我预计 02:00 会在 3 月 31 日被遗漏,因为这一天只有 23 小时,但我不知道为什么 03:00 出现两次,而 10 月 27 日 02:00只在那里一次而不是两次因为这一天有 25 个小时。我想要实现的是,在 3 月 2 点钟的特定日期的所有年份都不会被跳过(我宁愿输入 'n.a.' 或相应值的东西)并且 3 点钟有两个条目在 10 月的特定日期(但不是 3 月),这样我就会得到以下形式的列(其中 1 代表从 00:00-1:00 的小时,2 代表 1:00-2:00等):

  • 2013-03-31 1 +01
  • 2013-03-31 2 +01
  • 2013-03-31 3 +02
  • 2013-03-31 4 +02
  • 2013-03-31 5 +02
  • ...
  • 2013-10-27 1+02
  • 2013-10-27 2 +02
  • 2013-10-27 3A +02
  • 2013-10-27 3B +01
  • 2013-10-27 4 +01
  • 2013-10-27 5 +01
  • ...

有人知道如何去做吗?我做错了什么吗?这只是格式化的问题吗?我必须写一个函数吗?任何帮助,将不胜感激。谢谢。

最佳答案

Postgres 中的日期和时间以 UTC 存储,并根据时区配置指定的时区转换为本地时间。

这意味着你只需要解决表示问题。尝试使用 AT TIME ZONE 'UTC+2' 将 UTC 时间转换为您的时区并查看结果。这是查询:

SELECT (CAST('2013-03-30' AS DATE) + (n || ' hour')::INTERVAL) AT TIME ZONE 'UTC+2' 
    FROM generate_series(0, 1000) n;

关于sql - 如何使用时间戳正确处理夏令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22438862/

相关文章:

python - 如何在 Python 中使用 -0400 时区字符串解析日期?

c++ - 使用 Windows 注册表查找下一个 "Daylight Saving Time"

php - 我应该如何以一种可以可靠地用于转换为其他时区的方式在服务器端存储来自 JS 的时间戳?

php ajax 创建一个像google一样的搜索框

sql - 如何删除/重命名 SQL 中的重复列(非重复行)

mysql - MySQL 中何时使用单引号、双引号和反引号

python - sqlalchemy 动态绑定(bind)到模型

postgresql - 在 PostgreSQL 中创建数据库副本

mysql - 为什么一个查询比另一个查询快?

java - Log4j2 属性文件 JDBC 附加程序 - 将上下文变量转换为 uuid