【问题标题】:Default timestamp showing local time in oracle在 oracle 中显示本地时间的默认时间戳
【发布时间】:2018-02-23 05:12:50
【问题描述】:

我创建了一个带有 created_time 列的表,该列的默认时间为 systimestamp。 当我在其中插入一行时,时间会显示我的当地时间。 23-02-18 08:49:05.430419000 上午

但是当我查询 select systimstamp from dual 时,它显示 GMT 之类的 23-02-18 05:11:04.225141000 AM +00:00

如何确保默认时间戳也考虑 GMT?

CREATE TABLE TS_TEST (
MY_NAME VARCHAR2(100),
created_time TIMESTAMP(6) default CURRENT_TIMESTAMP
);
insert into TS_TEST (MY_NAME) Values ('george');

我希望 created_time 列应始终为 GMT

【问题讨论】:

  • 你用什么工具查询?请显示表格 DDL 语句,以便我们了解数据类型和默认语句以及是否涉及任何触发器。
  • 我正在使用 SQLDeveloper。
  • CREATE TABLE TS_TEST (MY_NAME VARCHAR2(100), created_time TIMESTAMP(6) default CURRENT_TIMESTAMP);

标签: oracle timestamp


【解决方案1】:

检查您的代码,然后您应该会发现问题所在。你说“default time as systimestamp”但你的代码是default CURRENT_TIMESTAMP

SYSTIMESTAMPCURRENT_TIMESTAMP 不同

  • SYSTIMESTAMP 在数据库服务器操作系统的时区(不是DBTIMEZONE!)中返回当前日期/时间为TIMESTAMP WITH TIME ZONE

  • CURRENT_TIMESTAMP 在当前用户会话时区(可能随时更改)中将当前日期/时间日期返回为TIMESTAMP WITH TIME ZONE

  • LOCALTIMESTAMP 在当前用户会话时区中将当前日期/时间日期返回为TIMESTAMP(没有时区信息)。

我会推荐这个:

CREATE TABLE TS_TEST (
   MY_NAME VARCHAR2(100),
   created_time TIMESTAMP(6) default SYS_EXTRACT_UTC(SYSTIMESTAMP)
);

或使用created_time TIMESTAMP(6) WITH TIME ZONE default SYSTIMESTAMP

【讨论】:

    【解决方案2】:
    CREATE TABLE TS_TEST (
    MY_NAME VARCHAR2(100),
    created_time TIMESTAMP(6) default CURRENT_TIMESTAMP AT TIME ZONE 'GMT'
    );
    

    【讨论】:

    • 这是为了回答您自己的问题吗?如果是这样,请添加一两行解释。但如果这应该是一个澄清,请编辑您的问题
    • 默认 SYS_EXTRACT_UTC(SYSTIMESTAMP) 优于默认 CURRENT_TIMESTAMP AT TIME ZONE 'GMT'?
    • 术语GMT 有点过时了。 CURRENT_TIMESTAMP AT TIME ZONE 'GMT' 返回一个 TIMESTAMP WITH TIME ZONE,它必须隐式转换为 TIMESTAMP。你的解决方案有效,但也许它不是最“漂亮”的。
    猜你喜欢
    • 2011-12-23
    • 2018-09-17
    • 2011-11-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多