postgresql 如何将时间转成date beijing时间

📅 发布时间:2026/7/9 19:10:20 👁️ 浏览次数:
postgresql 如何将时间转成date beijing时间
在 PostgreSQL 中将 UTC 时间转换为北京时间的DATE类型有以下几种方法核心方法方法 1使用AT TIME ZONE推荐sql复制-- UTC 时间转北京时间 DATE SELECT (your_timestamp AT TIME ZONE UTC AT TIME ZONE Asia/Shanghai)::DATE; -- 示例 SELECT (2026-01-30T00:00:00Z::TIMESTAMPTZ AT TIME ZONE UTC AT TIME ZONE Asia/Shanghai)::DATE; -- 结果: 2026-01-30注意双重AT TIME ZONE第一次TIMESTAMPTZ→TIMESTAMP去掉时区显示 UTC 时间第二次TIMESTAMP→ 目标时区的TIMESTAMP方法 2使用TIMEZONE()函数sql复制SELECT TIMEZONE(Asia/Shanghai, your_timestamp)::DATE; -- 示例 SELECT TIMEZONE(Asia/Shanghai, 2026-01-30T00:00:00Z::TIMESTAMPTZ)::DATE; -- 结果: 2026-01-30方法 3直接偏移8 小时不推荐用于生产sql复制SELECT (your_timestamp INTERVAL 8 hours)::DATE; -- 示例 SELECT (2026-01-30T00:00:00Z::TIMESTAMPTZ INTERVAL 8 hours)::DATE; -- 结果: 2026-01-30⚠️ 缺点不考虑夏令时北京时间固定 UTC8 没问题但其他时区可能出错。实际应用场景GORM Raw 查询中使用go复制// 查询北京时间某日期范围内的数据 beijingDate : 2026-01-30 var users []User sql : SELECT * FROM users WHERE (created_at AT TIME ZONE UTC AT TIME ZONE Asia/Shanghai)::DATE ? db.Raw(sql, beijingDate).Scan(users)按北京时间日期分组统计sql复制SELECT (created_at AT TIME ZONE UTC AT TIME ZONE Asia/Shanghai)::DATE as beijing_date, COUNT(*) as count FROM users GROUP BY beijing_date ORDER BY beijing_date;查询北京时间某天的数据范围sql复制-- 北京 2026-01-30 00:00:00 到 23:59:59 对应的 UTC 时间范围 SELECT * FROM users WHERE created_at 2026-01-29 16:00:00::TIMESTAMPTZ -- 北京时间 00:00 UTC 前一天 16:00 AND created_at 2026-01-30 16:00:00::TIMESTAMPTZ; -- 北京时间 24:00 UTC 当天 16:00快速对比表格方法语法适用场景AT TIME ZONE双重转换(ts AT TIME ZONE UTC AT TIME ZONE Asia/Shanghai)::DATE推荐标准时区处理TIMEZONE()函数TIMEZONE(Asia/Shanghai, ts)::DATE简洁等效方法直接 8 小时(ts INTERVAL 8 hours)::DATE简单场景不通用推荐写法GORM PostgreSQLgo复制// 封装为 GORM Scope func BeijingDate(date string) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { return db.Where( (created_at AT TIME ZONE UTC AT TIME ZONE Asia/Shanghai)::DATE ?, date, ) } } // 使用 db.Model(User{}).Scopes(BeijingDate(2026-01-30)).Find(users)