You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用TypeORM在Oracle数据库中存储无时区的日期数据

TypeORM 连接 Oracle 禁用时区存储的配置方案

全局统一配置

找到项目中的TypeORM数据源配置文件(通常为data-source.ts或ormconfig.ts),在Oracle连接配置的extra参数中添加关闭时区转换的配置:

import { DataSource } from 'typeorm';
import oracledb from 'oracledb';

export const AppDataSource = new DataSource({
  type: 'oracle',
  host: '数据库主机地址',
  port: 1521,
  username: '数据库账号',
  password: '数据库密码',
  serviceName: 'Oracle服务名',
  // 核心时区控制配置
  extra: {
    timezone: false,
    oracledb: {
      // 将日期时间类字段按字符串读取,避免驱动自动附加时区转换
      fetchAsString: [oracledb.DATE, oracledb.TIMESTAMP, oracledb.TIMESTAMP_TZ]
    }
  },
  entities: ['src/entities/**/*.entity.ts'],
  synchronize: false
})

配置说明:将timezone设为false后,TypeORM不会对写入的日期时间值做时区偏移转换,直接写入原始时间值到Oracle,不会存储时区相关信息。

单字段独立配置

如果不需要全局修改,仅需要部分日期字段不存储时区,可以在实体定义中指定字段类型为无时区的DATE/TIMESTAMP,搭配自定义转换器实现:

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity('your_table')
export class BusinessEntity {
  @PrimaryGeneratedColumn()
  id: number;

  // 普通日期字段,无时区信息
  @Column({ type: 'date', nullable: false })
  create_date: Date;

  // 高精度时间字段,自定义转换器避免时区转换
  @Column({
    type: 'timestamp',
    nullable: false,
    transformer: {
      // 写入数据库时直接返回原始值,不做转换
      to: (value: Date) => value,
      // 从数据库读取时直接转换为本地时间
      from: (value: string) => new Date(value)
    }
  })
  update_time: Date;
}

验证与注意事项

  • 配置完成后需要分别验证写入、查询两个场景的时间值,确认没有出现时区偏移的问题
  • 如果数据库中已经有存量带时区的时间数据,需要先做一次数据清洗,剥离时区信息后再启用新配置

内容的提问来源于stack exchange,提问作者Pavan Kumar Idapalapati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:57:03