Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将Sysdate转换为GMT?_Sql_Oracle_Timestamp With Timezone - Fatal编程技术网

Sql 如何将Sysdate转换为GMT?

Sql 如何将Sysdate转换为GMT?,sql,oracle,timestamp-with-timezone,Sql,Oracle,Timestamp With Timezone,所以场景很简单,我需要编写一个函数,其中将提供一个日期,这将是来自数据库的sysdate,函数的返回值应为GMT格式。此功能可根据业务场景跨不同数据库中的不同时区使用。我们需要注意夏令时的概念和其他事情,它应该返回GMT日期 请提供最佳建议。为了更好地理解,让我们从Oracle时区支持开始。时区信息有三种不同的来源: 操作系统的时区(在数据库启动时设置) 数据库时区(在数据库创建时设置) 会话的“本地”时区(可通过ALTER session更改) Oracle日期时间数据类型: 日期:包括

所以场景很简单,我需要编写一个函数,其中将提供一个日期,这将是来自数据库的sysdate,函数的返回值应为GMT格式。此功能可根据业务场景跨不同数据库中的不同时区使用。我们需要注意夏令时的概念和其他事情,它应该返回GMT日期


请提供最佳建议。

为了更好地理解,让我们从Oracle时区支持开始。时区信息有三种不同的来源:

  • 操作系统的时区(在数据库启动时设置)
  • 数据库时区(在数据库创建时设置)
  • 会话的“本地”时区(可通过
    ALTER session
    更改)
Oracle日期时间数据类型:

  • 日期
    :包括日期、小时、分钟和整秒,但不包括时区信息
  • 时间戳
    :也可以包括小数秒,但不包括时区信息
  • 带时区的时间戳
    :包括时区信息,可以是UTC('-4:00')的偏移量,也可以是指定时区('Europe/Paris')。偏移不会针对夏令时进行调整,而指定的时区会进行调整
  • 带本地时区的时间戳
    :该值在存储时转换为数据库时区,在选择时转换为会话时区
现在,对于返回“立即”的内置函数:

  • SYSDATE
    :基于操作系统时区的
    DATE
    (时间为秒)
  • SYSTIMESTAMP
    :基于操作系统时区的带时区的
    时间戳
    
  • 当前日期
    :基于会话时区的
    日期
    (时间为秒)
  • CURRENT_TIMESTAMP
    :基于会话时区的带时区的
    时间戳
    
  • LOCALTIMESTAMP
    :基于会话时区的
    TIMESTAMP
最后,有两种方法可以从其他时区到达格林尼治标准时间:

  • 时区“GMT”
    将返回带有时区的
    时间戳
  • SYS\u EXTRACT\u UTC
    将返回一个
    时间戳
这两种方法都需要某种类型的
时间戳
作为输入,然后需要将输出转换为
日期

因此,以下任何一项都将为您提供GMT时区中的
DATE
值:

select 
cast(systimestamp at time zone 'gmt' as date),
cast(current_timestamp at time zone 'gmt' as date),
cast(localtimestamp at time zone 'gmt' as date),
cast(sys_extract_utc(systimestamp) as date),
cast(sys_extract_utc(current_timestamp) as date),
cast(sys_extract_utc(localtimestamp) as date)
from dual;
注意:不要将SYSDATE传递给函数!让函数使用一个内置的时间戳函数。如果将日期传递给函数,函数必须假定它所属的时区。

Hi Stew“时区时间戳:包括时区信息,可以是UTC('-4:00')的偏移量,也可以是指定时区('Europe/Paris')。偏移量不根据夏令时进行调整,指定时区会进行调整。”你能提供一些关于它的更多信息吗?如果我使用cast(时区'GMT'作为日期的systimestamp)计算GMT,那么夏令时将对它产生影响?当我说:“偏移量不根据夏令时调整,指定的时区会调整”,这是一般信息。在这种特殊情况下,它没有实际的区别。使用命名时区时,Oracle会从其自己的“时区文件”中获取夏令时信息。调用SYSTIMESTAMP时,操作系统应处理夏令时,然后提供正确的偏移量。无论哪种方式,结果都是正确的,可以转换为GMT。