这个 SET TIME ZONE 应该像这样与 sqlx 一起工作吗?

问题描述 投票:0回答:1

如此处所述我正在使用以下代码:

use sqlx::Executor;
use sqlx::postgres::PgPoolOptions;

let pool = PgPoolOptions::new()
  .after_connect(|conn, _meta| Box::pin(async move {
    conn.execute("SET TIME ZONE 'Europe/Berlin';").await?;

    let result: (time::OffsetDateTime,) = sqlx::query_as("SELECT current_timestamp").fetch_one(conn).await?;

    println!("Current Time in Europe/Berlin: {}", result.0);

    Ok(())
  }))
  .connect("postgres:// …").await?;

结果是:

Current Time in Europe/Berlin: 2024-02-06 22:39:37.194022 +00:00:00

这是错误的,因为当前柏林时间是“23”而不是“22”(UTC)。

我的数据库当前默认采用 UTC(来自 postgresql.conf 文件)。

如果我在 Postgresql 查询中使用以下代码,它就会起作用:

SET TIME ZONE 'Europe/Berlin';
SELECT current_timestamp;

我哪里错了?

信息

  • SQLx 版本:
    0.7.3
  • 启用 SQLx 功能:
    "macros", "postgres", "runtime-tokio", "time"
  • 数据库服务器及版本:
    Postgres v16.1
  • 操作系统:
    Windows 10
  • rustc --version
    rustc 1.75.0 (82e1608df 2023-12-21)
postgresql rust timezone timestamp-with-timezone rust-sqlx
1个回答
0
投票

柏林的当前 UTC 时间与东京的当前 UTC 时间相同。时间戳是正确的,您添加到其中的文本也没有错误 - 只是整个事情非常混乱,因为如果您在时区感知时间戳上操作,则位置与当前时间无关,表示绝对时间点。

不用说,在查询中执行

set time zone
对 Rust 应用程序时区偏移配置没有影响 -
time
使用系统的偏移量。如果您的目标是让 Rust 应用程序打印出
2024-02-06 23:39:37.194022 +01:00:00
,则必须更改系统或应用程序的时区。您保存到
timestamp 
with
time zone
OffsetDateTime
的值不会受到影响,只是输出格式发生变化 - 同样,这些时间戳是绝对的。

如果您正在寻找“观察到的时间”,

at time zone
会返回该时间,这意味着剥离时区信息,为您提供在给定时区的某个位置拍摄的“时钟照片”

select now();
现在
2024-02-07 07:23:15.314852+00
set time zone 'Europe/Berlin';
select now();
现在
2024-02-07 08:23:15.316844+01
set time zone 'Europe/Berlin';
select now() at time zone 'UTC'
时区
2024-02-07 07:23:15.317335

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.