当前位置: 首页 > 知识库问答 >
问题:

具有原始timestamptz的时区date_trunc

袁鹤轩
2023-03-14

我有一个timestamptz,我想要date_trunc,所以它删除小时数:

但是,因为date_trunc删除了时区,所以我需要这样做:

date_trunc('day', '2019-01-01T17:43-03'::timestamptz) at time zone '-03'

但是,我不想硬编码时区,因为查询是在许多不同的时区中使用timestamptz运行的(这些时区是输入到查询的,而不是存储的)。所以我希望时区从原始时间戳中提取出来。我试着做这样的事情,但不起作用:

date_trunc('day', '2019-01-01T17:43-03'::timestamptz) at time zone EXTRACT(...)

与此相关,我试图从timestamptz中提取时区,但只得到0

SELECT EXTRACT(timezone FROM TIMESTAMP WITH TIME ZONE '2019-01-01T00:00+03')
0

共有1个答案

长孙哲
2023-03-14

我相信您可能对PostgreSQL中时间戳和时区的存储方式有误解(因为您似乎希望在调用date_trunc时保留-03并且“希望从原始时间戳中提取时区”)。根据文件

当输出具有时区值的时间戳时,它总是从UTC转换为当前时区区域,并在该区域中显示为本地时间。要查看另一个时区的时间,可以更改时区或使用AT时区构造(请参见第9.9.3节)。

因此,“在许多不同的时区中具有时间戳的不同客户机”的语句如果为真,将全部转换为UTC进行存储,然后显示在本地时区(或您指定的时区)中进行输出。因此,调用date_trunc()实际上会截断UTC时间戳,如果希望它显示在特定的时区中,则需要添加at TIME zone子句。

更新:这里有一个示例:

edb=# select date_trunc('day', '2019-01-01T17:43-03'::timestamptz) ;
       date_trunc       
------------------------
 2019-01-01 00:00:00+00
(1 row)

edb=# set timezone to 'US/Pacific';
SET
edb=# select date_trunc('day', '2019-01-01T17:43-03'::timestamptz) ;
       date_trunc       
------------------------
 2019-01-01 00:00:00-08
(1 row)

如您所见,date_trunc将追加我定义的时区-它不会被省略。

 类似资料:
  • 我正在使用Postgres 13和Laravel 8.4.4 为定义为强制转换到日期时间的雄辩模型属性设置Unix时间戳,我们得到正确的Carbon时间,。 但是,保存此模型实例(其中该列在迁移中定义为列)会导致保存。这不是正确的时区,导致不正确的时间。 在中,时区设置为UTC。我的电脑的时区是太平洋时间,所以它似乎以某种方式优先。你知道为什么吗? 我本以为时间戳是用碳编码的时区保存的,但显然不是

  • 问题内容: 我想问问哪段代码在Java中更有效?代码1: 代码2: 我的老师说第二个更好,但我不同意这种观点。 问题答案: 我更喜欢第一个而不是第二个,因为它使循环变量不会影响方法中其余代码。由于它们在循环外部不可见,因此以后不能无意间引用它们。 其他答案也是正确的: 不要 担心这种性能问题。但是,出于代码可读性的原因,并且为了与下一个出现的人交流程序员的意图, 请 考虑一下。这比微优化问题重要得

  • 如何用初始值初始化可变实时数据?我正在寻找类似的东西: < code>val text = MutableLiveData

  • 问题内容: 我目前正在使用一个小型框架来收集OSGi系统中的指标。它的核心是注释@Metric,它指示服务的给定方法可以在被询问时传递指标(例如,数值)。 这些方法看起来像: 要么 我正在使用反射来检查服务实现类并注册带有注释的方法。作为健全性检查,我正在检查该方法确实提供了一个数值。我尝试了这个但失败了: 然后,稍后在处理器上,我将执行以下操作: 事实证明,对于原始类型,您将得到例如,并且它不能

  • 问题内容: 我的测试框架中有一个方法可以创建类的实例,具体取决于传入的参数: 问题是,如果构造函数具有基本类型,则这将不起作用,如下所示: 结果是: 原始int会自动装箱到对象版本中,但是如何返回它们以调用构造函数? 问题答案: 使用代替。 根据Javadocs,这是“表示原始类型的Class实例”。 您也可以使用。这是的快捷方式。不仅是类,甚至对于原始类型,您都可以用Java表示。