【问题标题】:PostgreSQL get results in current time zonePostgreSQL 在当前时区获取结果
【发布时间】:2021-10-13 09:47:31
【问题描述】:

正如标题中所说,我希望有一个查询返回我当前时区的时间戳值(即使是夏令时!)。

my_table 是:

|timestamp|name|value|property1|property2|
|---|---|---|---|---|
|2021-08-01 00:00:00+00|10|0.44|0|0|
|2021-08-01 00:05:00+00|15|0.76|0|0|
|2021-08-01 00:10:00+00|12|0.28|0|0|

(别问我为什么不能把这张表直接放到markdown中……可能是日期的原因)

现在例如,如果我必须选择与我的时区中的一整天相对应的 24 小时,此时我的解决方案是:

SELECT timestamp AT TIME ZONE 'CEST',name,value
FROM my_table
WHERE name IN (10,11,12)
AND timestamp BETWEEN '2021-08-01 00:00:00+02' AND '2021-08-02 00:00:00+02' 
ORDER BY timestamp DESC

如您所见,这里有一个问题:

  • 我必须每次都指定我是 CEST 还是 CET(现在是 CEST)
  • 然后我必须在日期末尾添加 +02(或 CET 中的 +01)

有办法避免这种概念上的重复吗??任何改进查询的建议都值得赞赏

命令SELECT version(); 会返回PostgreSQL 12.7

【问题讨论】:

  • timestamp 字段的实际数据类型是什么(使用类型作为字段名称不是一个好主意)?
  • 是一个时间戳!是的,可能不是一个好主意...好叫 ty

标签: sql postgresql timezone


【解决方案1】:

适当设置会话的时区。

set timezone TO 'Europe/Berlin';

select '2021-08-01 00:00:00+00'::timestamptz;
      timestamptz       
------------------------
 2021-08-01 02:00:00+02

select '2021-12-01 00:00:00+00'::timestamptz;
      timestamptz       
------------------------
 2021-12-01 01:00:00+01

select '2021-08-01 00:00:00'::timestamptz;
      timestamptz       
------------------------
 2021-08-01 00:00:00+02

您的会话时区现在设置为多少?

【讨论】:

  • 我的数据库在 UTC 和我的会话中,但问题是如果我想要今天的数据(我在“欧洲/柏林”),例如我必须在选择范围时添加 +02 .我可以在操作符之间避免它吗?顺便说一句,切换会话是个好主意
  • 设置会话时区应该使 BETWEEN 正常工作。如果输入中未指定任何内容,则会自动添加 +2(或非夏季时 +1),如第三个示例所示。
  • 对不起,我不太明白你的回答......它有效!这是完整的查询:set timezone TO 'Europe/Berlin'; SELECT timestamp::timestamptz,name,value FROM my_table WHERE name IN (10,11,12) AND timestamp BETWEEN '2021-08-01 00:00:00' AND '2021-08-02 00:00:00' ORDER按时间戳 DESC。 Porb 最好将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 2020-04-28
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2019-12-15
  • 2022-01-08
  • 2017-03-13
相关资源
最近更新 更多